diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java index 5858e5d2e..57c8e1d3e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java @@ -1408,7 +1408,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { protected List getOperationArguments(AggregationOperationContext context) { List result = new ArrayList(values.size()); - result.add(context.getReference(getField().getName()).toString()); + result.add(context.getReference(getField()).toString()); for (Object element : values) { 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 9af74d70f..99e8bc386 100644 --- 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 @@ -40,7 +40,7 @@ import com.mongodb.util.JSON; /** * Unit tests for {@link Aggregation}. - * + * * @author Oliver Gierke * @author Thomas Darimont * @author Christoph Strobl @@ -564,6 +564,16 @@ public class AggregationUnitTests { assertThat(getAsDBObject(fields, "foosum"), isBsonObject().containing("$first.$cond.else", "no-answer")); } + @Test // DATAMONGO-1756 + public void projectOperationShouldRenderNestedFieldNamesCorrectly() { + + DBObject agg = newAggregation(project().and("value1.value").plus("value2.value").as("val")).toDbObject("collection", + Aggregation.DEFAULT_CONTEXT); + + assertThat((BasicDBObject) extractPipelineElement(agg, 0, "$project"), is(equalTo(new BasicDBObject("val", + new BasicDBObject("$add", new BasicDbListBuilder().add("$value1.value").add("$value2.value").get()))))); + } + private DBObject extractPipelineElement(DBObject agg, int index, String operation) { List pipeline = (List) agg.get("pipeline"); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/TypeBasedAggregationOperationContextUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/TypeBasedAggregationOperationContextUnitTests.java index 76f086071..38dc2bab1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/TypeBasedAggregationOperationContextUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/TypeBasedAggregationOperationContextUnitTests.java @@ -47,6 +47,7 @@ import org.springframework.data.mongodb.core.convert.QueryMapper; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.test.util.BasicDbListBuilder; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; @@ -54,7 +55,7 @@ import com.mongodb.util.JSON; /** * Unit tests for {@link TypeBasedAggregationOperationContext}. - * + * * @author Oliver Gierke * @author Thomas Darimont * @author Mark Paluch @@ -336,6 +337,19 @@ public class TypeBasedAggregationOperationContextUnitTests { assertThat(age, isBsonObject().containing("$ifNull.[1]._class", Age.class.getName())); } + @Test // DATAMONGO-1756 + public void projectOperationShouldRenderNestedFieldNamesCorrectlyForTypedAggregation() { + + AggregationOperationContext context = getContext(Wrapper.class); + + DBObject agg = newAggregation(Wrapper.class, project().and("nested1.value1").plus("nested2.value2").as("val")) + .toDbObject("collection", context); + + BasicDBObject project = (BasicDBObject) getPipelineElementFromAggregationAt(agg, 0).get("$project"); + assertThat(project, is(equalTo(new BasicDBObject("val", new BasicDBObject("$add", + new BasicDbListBuilder().add("$nested1.value1").add("$field2.nestedValue2").get()))))); + } + @Document(collection = "person") public static class FooPerson { @@ -406,4 +420,15 @@ public class TypeBasedAggregationOperationContextUnitTests { String name; } + + static class Wrapper { + + Nested nested1; + @org.springframework.data.mongodb.core.mapping.Field("field2") Nested nested2; + } + + static class Nested { + String value1; + @org.springframework.data.mongodb.core.mapping.Field("nestedValue2") String value2; + } }