Skip to content

Commit 07c728b

Browse files
christophstroblmp911de
authored andcommitted
DATAMONGO-2644 - ProjectOperation no longer errors on inclusion of default _id field.
Original pull request: #890.
1 parent c7e1ca5 commit 07c728b

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ProjectionOperation.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ public Document toDocument(AggregationOperationContext context) {
264264
return new Document(getOperator(), fieldObject);
265265
}
266266

267-
/*
267+
/*
268268
* (non-Javadoc)
269269
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#getOperator()
270270
*/
@@ -1450,6 +1450,14 @@ private Object renderFieldValue(AggregationOperationContext context) {
14501450
return field.getTarget();
14511451
}
14521452

1453+
if (field.getTarget().equals(Fields.UNDERSCORE_ID)) {
1454+
try {
1455+
return context.getReference(field).getReferenceValue();
1456+
} catch (java.lang.IllegalArgumentException e) {
1457+
return Fields.UNDERSCORE_ID_REF;
1458+
}
1459+
}
1460+
14531461
// check whether referenced field exists in the context
14541462
return context.getReference(field).getReferenceValue();
14551463

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationUnitTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929
import org.junit.jupiter.api.Test;
3030
import org.springframework.data.domain.Sort.Direction;
3131
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond;
32+
import org.springframework.data.mongodb.core.aggregation.ProjectionOperationUnitTests.BookWithFieldAnnotation;
33+
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
34+
import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver;
35+
import org.springframework.data.mongodb.core.convert.QueryMapper;
36+
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
3237
import org.springframework.data.mongodb.core.query.Criteria;
3338

3439
/**
@@ -582,6 +587,17 @@ void shouldAllowInternalThisAndValueReferences() {
582587
"{\"attributeRecordArrays\": {\"$reduce\": {\"input\": \"$attributeRecordArrays\", \"initialValue\": [], \"in\": {\"$concatArrays\": [\"$$value\", \"$$this\"]}}}}"));
583588
}
584589

590+
@Test // DATAMONGO-2644
591+
void projectOnIdIsAlwaysValid() {
592+
593+
MongoMappingContext mappingContext = new MongoMappingContext();
594+
Document target = new Aggregation(bucket("start"), project("_id")).toDocument("collection-1",
595+
new RelaxedTypeBasedAggregationOperationContext(BookWithFieldAnnotation.class, mappingContext,
596+
new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext))));
597+
598+
assertThat(extractPipelineElement(target, 1, "$project")).isEqualTo(Document.parse(" { \"_id\" : \"$_id\" }"));
599+
}
600+
585601
private Document extractPipelineElement(Document agg, int index, String operation) {
586602

587603
List<Document> pipeline = (List<Document>) agg.get("pipeline");

0 commit comments

Comments
 (0)