diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java index 2877a5375..82a4845b1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java @@ -67,6 +67,11 @@ class ExposedFieldsAggregationOperationContext implements AggregationOperationCo * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.AggregationOperationContext#getReference(org.springframework.data.mongodb.core.aggregation.ExposedFields.AvailableField) */ + @Override + public Document getMappedObject(Document document) { + return rootContext.getMappedObject(document); + } + @Override public FieldReference getReference(Field field) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java index 078eb65ba..6b594eef4 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java @@ -87,6 +87,7 @@ import com.mongodb.client.MongoCollection; * @author Maninder Singh * @author Sergey Shcherbakov * @author Minsu Kim + * @author Julia Lee */ @ExtendWith(MongoTemplateExtension.class) public class AggregationTests { @@ -116,7 +117,7 @@ public class AggregationTests { mongoTemplate.flush(Product.class, UserWithLikes.class, DATAMONGO753.class, Data.class, DATAMONGO788.class, User.class, Person.class, Reservation.class, Venue.class, MeterData.class, LineItem.class, InventoryItem.class, - Sales.class, Sales2.class, Employee.class, Art.class, Venue.class); + Sales.class, Sales2.class, Employee.class, Art.class, Venue.class, Item.class); mongoTemplate.dropCollection(INPUT_COLLECTION); mongoTemplate.dropCollection("personQueryTemp"); @@ -1962,6 +1963,23 @@ public class AggregationTests { assertThat(aggregate.getMappedResults()).contains(widget); } + @Test // GH-4443 + void shouldHonorFieldAliasesForFieldReferencesUsingFieldExposingOperation() { + + Item item1 = Item.builder().itemId("1").tags(Arrays.asList("a", "b")).build(); + Item item2 = Item.builder().itemId("1").tags(Arrays.asList("a", "c")).build(); + mongoTemplate.insert(Arrays.asList(item1, item2), Item.class); + + TypedAggregation aggregation = newAggregation(Item.class, + match(where("itemId").is("1")), + unwind("tags"), + match(where("itemId").is("1").and("tags").is("c"))); + AggregationResults results = mongoTemplate.aggregate(aggregation, Document.class); + List mappedResults = results.getMappedResults(); + assertThat(mappedResults).hasSize(1); + assertThat(mappedResults.get(0)).containsEntry("item_id", "1"); + } + private void createUsersWithReferencedPersons() { mongoTemplate.dropCollection(User.class); @@ -2220,7 +2238,7 @@ public class AggregationTests { List items; } - // DATAMONGO-1491 + // DATAMONGO-1491, GH-4443 @lombok.Data @Builder static class Item { @@ -2229,6 +2247,7 @@ public class AggregationTests { String itemId; Integer quantity; Long price; + List tags = new ArrayList<>(); } // DATAMONGO-1538 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java index 7305dc9b1..aa2c6d9e4 100755 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java @@ -44,6 +44,7 @@ import org.springframework.data.mongodb.core.query.Criteria; * @author Thomas Darimont * @author Christoph Strobl * @author Mark Paluch + * @author Julia Lee */ public class AggregationUnitTests { @@ -607,7 +608,23 @@ public class AggregationUnitTests { RelaxedTypeBasedAggregationOperationContext context = new RelaxedTypeBasedAggregationOperationContext(WithRetypedIdField.class, mappingContext, new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext))); Document document = project(WithRetypedIdField.class).toDocument(context); - assertThat(document).isEqualTo(new Document("$project", new Document("_id", 1).append("renamed-field", 1))); + assertThat(document).isEqualTo(new Document("$project", new Document("_id", 1).append("renamed-field", 1).append("entries", 1))); + } + + @Test // GH-4443 + void fieldsExposingContextShouldUseCustomFieldNameFromRelaxedRootContext() { + + MongoMappingContext mappingContext = new MongoMappingContext(); + RelaxedTypeBasedAggregationOperationContext context = new RelaxedTypeBasedAggregationOperationContext( + WithRetypedIdField.class, mappingContext, + new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext))); + + TypedAggregation agg = newAggregation(WithRetypedIdField.class, + unwind("entries"), match(where("foo").is("value 2"))); + List pipeline = agg.toPipeline(context); + + Document fields = getAsDocument(pipeline.get(1), "$match"); + assertThat(fields.get("renamed-field")).isEqualTo("value 2"); } private Document extractPipelineElement(Document agg, int index, String operation) { @@ -625,5 +642,7 @@ public class AggregationUnitTests { @org.springframework.data.mongodb.core.mapping.Field("renamed-field") private String foo; + private List entries = new ArrayList<>(); + } }