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 57c8e1d3e..4b3c56f90 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 @@ -455,7 +455,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { } if (value instanceof AggregationExpression) { - return this.operation.and(new ExpressionProjection(Fields.field(alias), (AggregationExpression) value)); + return this.operation.and(new ExpressionProjection(Fields.field(alias, alias), (AggregationExpression) value)); } return this.operation.and(new FieldProjection(Fields.field(alias, name), null)); 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 99e8bc386..d56bb9c20 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 @@ -574,6 +574,23 @@ public class AggregationUnitTests { new BasicDBObject("$add", new BasicDbListBuilder().add("$value1.value").add("$value2.value").get()))))); } + @Test // DATAMONGO-1871 + public void providedAliasShouldAllowNestingExpressionWithAliasCorrectly() { + + DBObject condition = new BasicDBObject("$and", + Arrays.asList(new BasicDBObject("$gte", new BasicDbListBuilder().add("$$est.dt").add("2015-12-29").get()), // + new BasicDBObject("$lte", new BasicDbListBuilder().add("$$est.dt").add("2017-12-29").get()) // + )); + + Aggregation agg = newAggregation(project("_id", "dId", "aId", "cty", "cat", "plts.plt") + .and(ArrayOperators.arrayOf("plts.ests").filter().as("est").by(condition)).as("plts.ests")); + + DBObject $project = extractPipelineElement(agg.toDbObject("collection-1", Aggregation.DEFAULT_CONTEXT), 0, + "$project"); + + assertThat($project.containsField("plts.ests"), is(true)); + } + private DBObject extractPipelineElement(DBObject agg, int index, String operation) { List pipeline = (List) agg.get("pipeline");