diff --git a/pom.xml b/pom.xml
index d864b2e4e6..24f8f5d5fa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.1.0-SNAPSHOT
+ 4.1.x-GH-3917-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index 1b2a1390e6..284c9764d8 100644
--- a/spring-data-mongodb-benchmarks/pom.xml
+++ b/spring-data-mongodb-benchmarks/pom.xml
@@ -7,7 +7,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.1.0-SNAPSHOT
+ 4.1.x-GH-3917-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 8db8d798fb..33d31ac969 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.1.0-SNAPSHOT
+ 4.1.x-GH-3917-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 9a57f7eb52..2f98fd6760 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -13,7 +13,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.1.0-SNAPSHOT
+ 4.1.x-GH-3917-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java
index 6572eabcf7..1a88175d76 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFieldsAggregationOperationContext.java
@@ -96,6 +96,25 @@ private FieldReference getReference(@Nullable Field field, String name) {
return exposedField;
}
+ if(rootContext instanceof RelaxedTypeBasedAggregationOperationContext) {
+ return new DirectFieldReference(new ExposedField(new Field() {
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getTarget() {
+ return field != null ? field.getTarget() : name;
+ }
+
+ @Override
+ public boolean isAliased() {
+ return true;
+ }
+ }, true));
+ }
+
throw new IllegalArgumentException(String.format("Invalid reference '%s'", name));
}
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 9670bcf039..64bd9a1412 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,7 @@
import org.bson.Document;
import org.junit.jupiter.api.Test;
import org.springframework.data.annotation.Id;
+import org.springframework.data.domain.Sort;
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;
@@ -629,6 +630,28 @@ void createsBasicAggregationOperationFromBson() {
Document target = newAggregation(stage).toDocument("col-1", DEFAULT_CONTEXT);
assertThat(extractPipelineElement(target, 0, "$project")).containsKey("name");
}
+
+ @Test // GH-3917
+ void inheritedFieldsExposingContextShouldNotFailOnUnknownFieldReferenceForRelaxedRootContext() {
+
+ List aggregationOperations = new ArrayList<>();
+
+ GroupOperation groupOperation = Aggregation.group("_id", "label_name");
+ aggregationOperations.add(groupOperation);
+
+ ProjectionOperation projectionOperation = Aggregation.project("label_name").andExclude("_id");
+ aggregationOperations.add(projectionOperation);
+
+ Sort sort = Sort.by(Sort.Direction.DESC, "serial_number");
+ SortOperation sortOperation = new SortOperation(sort).and(Sort.Direction.DESC, "label_name");
+ aggregationOperations.add(sortOperation);
+
+ MongoMappingContext mappingContext = new MongoMappingContext();
+ QueryMapper queryMapper = new QueryMapper(new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext));
+
+ List documents = newAggregation(City.class, aggregationOperations).toPipeline(new RelaxedTypeBasedAggregationOperationContext(City.class, mappingContext, queryMapper));
+ assertThat(documents.get(2)).isEqualTo("{ $sort : { 'serial_number' : -1, 'label_name' : -1 } }");
+ }
private Document extractPipelineElement(Document agg, int index, String operation) {