diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java index 4a5d7610b..ab07a506c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java @@ -259,6 +259,15 @@ public class ExposedFields implements Iterable { return field.getTarget(); } + /* + * (non-Javadoc) + * @see org.springframework.data.mongodb.core.aggregation.Field#isAliased() + */ + @Override + public boolean isAliased() { + return field.isAliased(); + } + /** * Returns whether the field can be referred to using the given name. * diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Field.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Field.java index 76a01f1af..4ac7f5b18 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Field.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Field.java @@ -36,4 +36,11 @@ public interface Field { * @return must not be {@literal null}. */ String getTarget(); + + /** + * Returns whether the Field is aliased, which means it has a name set different from the target. + * + * @return + */ + boolean isAliased(); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java index 050d6be60..383b3e3a5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java @@ -224,6 +224,15 @@ public class Fields implements Iterable { return StringUtils.hasText(this.target) ? this.target : this.name; } + /* + * (non-Javadoc) + * @see org.springframework.data.mongodb.core.aggregation.Field#isAliased() + */ + @Override + public boolean isAliased() { + return !getName().equals(getTarget()); + } + /* * (non-Javadoc) * @see java.lang.Object#toString() 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 d029a45a7..5ebb27b32 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 @@ -507,15 +507,8 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { // check whether referenced field exists in the context FieldReference reference = context.getReference(field.getTarget()); + return reference.isSynthetic() && !field.isAliased() ? 1 : reference.toString(); - if (field.getName().equals(field.getTarget()) && reference.isSynthetic()) { - - // render field as included - return 1; - } - - // render field reference - return reference.toString(); } else if (Boolean.FALSE.equals(value)) { // render field as excluded 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 4951c246b..cd1066b1c 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 @@ -117,7 +117,7 @@ public class AggregationUnitTests { @SuppressWarnings("unchecked") DBObject secondProjection = ((List) agg.get("pipeline")).get(2); DBObject fields = DBObjectUtils.getAsDBObject(secondProjection, "$project"); - assertThat((Integer) fields.get("aCnt"), is(1)); - assertThat((String) fields.get("a"), is("$_id.a")); + assertThat(fields.get("aCnt"), is((Object) 1)); + assertThat(fields.get("a"), is((Object) "$_id.a")); } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperationUnitTests.java index 44944c99e..55b6a8a2d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperationUnitTests.java @@ -67,7 +67,7 @@ public class ProjectionOperationUnitTests { DBObject dbObject = operation.toDBObject(Aggregation.DEFAULT_CONTEXT); DBObject projectClause = DBObjectUtils.getAsDBObject(dbObject, PROJECT); - assertThat((Integer) projectClause.get("foo"), is(1)); + assertThat(projectClause.get("foo"), is((Object) 1)); assertThat(projectClause.get("bar"), is((Object) "$foobar")); }