From 080c7987217c4fdf6651a87b480718dfdc959f49 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 9 Nov 2020 11:15:54 +0100 Subject: [PATCH] DATAMONGO-2644 - ProjectOperation no longer errors on inclusion of default _id field. Original pull request: #890. --- .../core/aggregation/ProjectionOperation.java | 10 +++++++++- .../core/aggregation/AggregationUnitTests.java | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) 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 21278041a..82a1de69d 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 @@ -264,7 +264,7 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { return new Document(getOperator(), fieldObject); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#getOperator() */ @@ -1450,6 +1450,14 @@ public class ProjectionOperation implements FieldsExposingAggregationOperation { return field.getTarget(); } + if (field.getTarget().equals(Fields.UNDERSCORE_ID)) { + try { + return context.getReference(field).getReferenceValue(); + } catch (java.lang.IllegalArgumentException e) { + return Fields.UNDERSCORE_ID_REF; + } + } + // check whether referenced field exists in the context return context.getReference(field).getReferenceValue(); 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 e51932abe..37dc8727f 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 @@ -29,6 +29,11 @@ import org.bson.Document; import org.junit.jupiter.api.Test; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond; +import org.springframework.data.mongodb.core.aggregation.ProjectionOperationUnitTests.BookWithFieldAnnotation; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; +import org.springframework.data.mongodb.core.convert.QueryMapper; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.query.Criteria; /** @@ -582,6 +587,17 @@ public class AggregationUnitTests { "{\"attributeRecordArrays\": {\"$reduce\": {\"input\": \"$attributeRecordArrays\", \"initialValue\": [], \"in\": {\"$concatArrays\": [\"$$value\", \"$$this\"]}}}}")); } + @Test // DATAMONGO-2644 + void projectOnIdIsAlwaysValid() { + + MongoMappingContext mappingContext = new MongoMappingContext(); + Document target = new Aggregation(bucket("start"), project("_id")).toDocument("collection-1", + new RelaxedTypeBasedAggregationOperationContext(BookWithFieldAnnotation.class, mappingContext, + new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)))); + + assertThat(extractPipelineElement(target, 1, "$project")).isEqualTo(Document.parse(" { \"_id\" : \"$_id\" }")); + } + private Document extractPipelineElement(Document agg, int index, String operation) { List pipeline = (List) agg.get("pipeline");