Skip to content

Commit c8b3794

Browse files
christophstroblmp911de
authored andcommitted
Avoid multiple mapping iterations.
A 2nd pass is no longer needed as the context already does all the work. Closes: #4043 Original pull request: #4240
1 parent 51f06d7 commit c8b3794

File tree

2 files changed

+36
-18
lines changed

2 files changed

+36
-18
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/AggregationUtil.java

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
3333
import org.springframework.data.util.Lazy;
3434
import org.springframework.lang.Nullable;
35-
import org.springframework.util.ObjectUtils;
3635

3736
/**
3837
* Utility methods to map {@link org.springframework.data.mongodb.core.aggregation.Aggregation} pipeline definitions and
@@ -96,12 +95,7 @@ AggregationOperationContext createAggregationContext(Aggregation aggregation, @N
9695
* @return
9796
*/
9897
List<Document> createPipeline(Aggregation aggregation, AggregationOperationContext context) {
99-
100-
if (ObjectUtils.nullSafeEquals(context, Aggregation.DEFAULT_CONTEXT)) {
101-
return aggregation.toPipeline(context);
102-
}
103-
104-
return mapAggregationPipeline(aggregation.toPipeline(context));
98+
return aggregation.toPipeline(context);
10599
}
106100

107101
/**
@@ -112,16 +106,7 @@ List<Document> createPipeline(Aggregation aggregation, AggregationOperationConte
112106
* @return
113107
*/
114108
Document createCommand(String collection, Aggregation aggregation, AggregationOperationContext context) {
115-
116-
Document command = aggregation.toDocument(collection, context);
117-
118-
if (!ObjectUtils.nullSafeEquals(context, Aggregation.DEFAULT_CONTEXT)) {
119-
return command;
120-
}
121-
122-
command.put("pipeline", mapAggregationPipeline(command.get("pipeline", List.class)));
123-
124-
return command;
109+
return aggregation.toDocument(collection, context);
125110
}
126111

127112
private List<Document> mapAggregationPipeline(List<Document> pipeline) {

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@
4343

4444
import org.assertj.core.data.Offset;
4545
import org.bson.Document;
46+
import org.bson.types.ObjectId;
4647
import org.junit.jupiter.api.AfterEach;
4748
import org.junit.jupiter.api.BeforeEach;
4849
import org.junit.jupiter.api.Test;
4950
import org.junit.jupiter.api.extension.ExtendWith;
50-
5151
import org.springframework.core.io.ClassPathResource;
5252
import org.springframework.data.annotation.Id;
5353
import org.springframework.data.domain.Sort;
@@ -65,6 +65,7 @@
6565
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
6666
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
6767
import org.springframework.data.mongodb.core.index.GeospatialIndex;
68+
import org.springframework.data.mongodb.core.mapping.MongoId;
6869
import org.springframework.data.mongodb.core.query.Criteria;
6970
import org.springframework.data.mongodb.core.query.NearQuery;
7071
import org.springframework.data.mongodb.core.query.Query;
@@ -1933,6 +1934,24 @@ void mapsEnumsInMatchClauseUsingInCriteriaCorrectly() {
19331934
assertThat(results.getMappedResults()).hasSize(1);
19341935
}
19351936

1937+
@Test // GH-4043
1938+
void considersMongoIdWithinTypedCollections() {
1939+
1940+
UserRef userRef = new UserRef();
1941+
userRef.id = "4ee921aca44fd11b3254e001";
1942+
userRef.name = "u-1";
1943+
1944+
Widget widget = new Widget();
1945+
widget.id = "w-1";
1946+
widget.users = List.of(userRef);
1947+
1948+
mongoTemplate.save(widget);
1949+
1950+
Criteria criteria = Criteria.where("users").elemMatch(Criteria.where("id").is("4ee921aca44fd11b3254e001"));
1951+
AggregationResults<Widget> aggregate = mongoTemplate.aggregate(newAggregation(match(criteria)), Widget.class, Widget.class);
1952+
assertThat(aggregate.getMappedResults()).contains(widget);
1953+
}
1954+
19361955
private void createUsersWithReferencedPersons() {
19371956

19381957
mongoTemplate.dropCollection(User.class);
@@ -2250,4 +2269,18 @@ static class WithEnum {
22502269
@Id String id;
22512270
MyEnum enumValue;
22522271
}
2272+
2273+
@lombok.Data
2274+
static class Widget {
2275+
@Id
2276+
String id;
2277+
List<UserRef> users;
2278+
}
2279+
2280+
@lombok.Data
2281+
static class UserRef {
2282+
@MongoId
2283+
String id;
2284+
String name;
2285+
}
22532286
}

0 commit comments

Comments
 (0)