diff --git a/pom.xml b/pom.xml
index a401249d79..44d406e395 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.0.0-SNAPSHOT
+ 4.0.x-GH-4139-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index c28a240d2c..e6c6c85c05 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.0.0-SNAPSHOT
+ 4.0.x-GH-4139-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 0412911f82..4ccc16c862 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.0.0-SNAPSHOT
+ 4.0.x-GH-4139-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index cb8c76ade4..d86ed0bbfd 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.0.0-SNAPSHOT
+ 4.0.x-GH-4139-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AbstractAggregationExpression.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AbstractAggregationExpression.java
index bb46ee3959..f84e427bd4 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AbstractAggregationExpression.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/AbstractAggregationExpression.java
@@ -19,11 +19,16 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
import org.bson.Document;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Order;
+import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
@@ -68,8 +73,24 @@ private Object unpack(Object value, AggregationOperationContext context) {
return ((AggregationExpression) value).toDocument(context);
}
- if (value instanceof Field) {
- return context.getReference((Field) value).toString();
+ if (value instanceof Field field) {
+ return context.getReference(field).toString();
+ }
+
+ if (value instanceof Fields fields) {
+ return fields.asList().stream().map(it -> unpack(it, context)).collect(Collectors.toList());
+ }
+
+ if (value instanceof Sort sort) {
+
+ Document sortDoc = new Document();
+ for (Order order : sort) {
+
+ // Check reference
+ FieldReference reference = context.getReference(order.getProperty());
+ sortDoc.put(reference.getRaw(), order.isAscending() ? 1 : -1);
+ }
+ return sortDoc;
}
if (value instanceof List) {
@@ -134,9 +155,40 @@ protected Map append(String key, Object value) {
Assert.isInstanceOf(Map.class, this.value, "Value must be a type of Map");
- Map clone = new LinkedHashMap<>((java.util.Map) this.value);
+ return append((Map) this.value, key, value);
+ }
+
+ private Map append(Map existing, String key, Object value) {
+
+ Map clone = new LinkedHashMap<>(existing);
clone.put(key, value);
return clone;
+ }
+
+ protected Map appendTo(String key, Object value) {
+
+ Assert.isInstanceOf(Map.class, this.value, "Value must be a type of Map");
+
+ if (this.value instanceof Map map) {
+
+ Map target = new HashMap<>(map);
+ if (!target.containsKey(key)) {
+ target.put(key, value);
+ return target;
+ }
+ target.computeIfPresent(key, (k, v) -> {
+
+ if (v instanceof List> list) {
+ List