Skip to content

Commit 7146fb3

Browse files
christophstroblmp911de
authored andcommitted
Fix field inclusion in aggregation project operation.
Closes #3898 Original pull request: #3904.
1 parent 75999d9 commit 7146fb3

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-5
lines changed

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -1803,8 +1803,9 @@ public Document toDocument(AggregationOperationContext context) {
18031803
Document projections = new Document();
18041804

18051805
Fields fields = context.getFields(type);
1806-
fields.forEach(it -> projections.append(it.getName(), 1));
1807-
return context.getMappedObject(projections, type);
1806+
1807+
fields.forEach(it -> projections.append(it.getTarget(), 1));
1808+
return projections;
18081809
}
18091810
}
18101811

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,13 @@ public Fields getFields(Class<?> type) {
122122
return AggregationOperationContext.super.getFields(type);
123123
}
124124

125-
List<String> fields = new ArrayList<>();
125+
List<Field> fields = new ArrayList<>();
126126

127127
for (MongoPersistentProperty property : entity) {
128-
fields.add(property.getName());
128+
fields.add(Fields.field(property.getName(), property.getFieldName()));
129129
}
130130

131-
return Fields.fields(fields.toArray(new String[0]));
131+
return Fields.from(fields.toArray(new Field[0]));
132132
}
133133

134134
/*

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

+23
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import org.bson.Document;
2929
import org.junit.jupiter.api.Test;
30+
import org.springframework.data.annotation.Id;
3031
import org.springframework.data.domain.Sort.Direction;
3132
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond;
3233
import org.springframework.data.mongodb.core.aggregation.ProjectionOperationUnitTests.BookWithFieldAnnotation;
@@ -598,9 +599,31 @@ void projectOnIdIsAlwaysValid() {
598599
assertThat(extractPipelineElement(target, 1, "$project")).isEqualTo(Document.parse(" { \"_id\" : \"$_id\" }"));
599600
}
600601

602+
603+
@Test // GH-3898
604+
void shouldNotConvertIncludeExcludeValuesForProjectOperation() {
605+
606+
MongoMappingContext mappingContext = new MongoMappingContext();
607+
RelaxedTypeBasedAggregationOperationContext context = new RelaxedTypeBasedAggregationOperationContext(WithRetypedIdField.class, mappingContext,
608+
new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)));
609+
Document document = project(WithRetypedIdField.class).toDocument(context);
610+
assertThat(document).isEqualTo(new Document("$project", new Document("_id", 1).append("renamed-field", 1)));
611+
}
612+
601613
private Document extractPipelineElement(Document agg, int index, String operation) {
602614

603615
List<Document> pipeline = (List<Document>) agg.get("pipeline");
604616
return (Document) pipeline.get(index).get(operation);
605617
}
618+
619+
public class WithRetypedIdField {
620+
621+
@Id
622+
@org.springframework.data.mongodb.core.mapping.Field
623+
private String id;
624+
625+
@org.springframework.data.mongodb.core.mapping.Field("renamed-field")
626+
private String foo;
627+
628+
}
606629
}

0 commit comments

Comments
 (0)