diff --git a/pom.xml b/pom.xml
index 340e6922b4..853517893b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.2.0.BUILD-SNAPSHOT
+ 2.2.0.DATAMONGO-2311-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index bb7d9f03cc..5ea2044613 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
- 2.2.0.BUILD-SNAPSHOT
+ 2.2.0.DATAMONGO-2311-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index b32dcba387..4d0da69ce2 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.2.0.BUILD-SNAPSHOT
+ 2.2.0.DATAMONGO-2311-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index b611cf01a8..05fab3b29f 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -11,7 +11,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.2.0.BUILD-SNAPSHOT
+ 2.2.0.DATAMONGO-2311-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Aggregation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Aggregation.java
index 5cf5c852cc..6b1c9f2804 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Aggregation.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Aggregation.java
@@ -244,6 +244,29 @@ public static ProjectionOperation project(Fields fields) {
return new ProjectionOperation(fields);
}
+ /**
+ * Creates a new {@link ProjectionOperation} adding the given {@link AggregationExpression} as projection.
+ *
+ * @param expression must not be {@literal null}.
+ * @return new instance of {@link ProjectionOperation}.
+ * @throws IllegalArgumentException if the required argument is {@literal null}.
+ * @since 2.2
+ */
+ public static ProjectionOperation project(AggregationExpression expression) {
+
+ return new ProjectionOperation(Fields.fields()) {
+
+ @Override
+ public Document toDocument(AggregationOperationContext context) {
+
+ Document target = super.toDocument(context);
+ Document $project = target.get("$project", Document.class);
+ $project.putAll(expression.toDocument(context));
+ return target;
+ }
+ };
+ }
+
/**
* Factory method to create a new {@link UnwindOperation} for the field with the given name.
*
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java
index 7e481e5111..73573a60fe 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java
@@ -1930,6 +1930,13 @@ public void runMatchOperationCriteriaThroughQueryMapperForUntypedAggregation() {
assertThat(groupResults.getMappedResults().size()).isEqualTo(4);
}
+ @Test // DATAMONGO-2311
+ public void projectWithAggregationExpression() {
+
+ assertThat(project(ctx -> new Document("field", 1)).toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(new Document("$project", new Document("field", 1)));
+ }
+
private void createUsersWithReferencedPersons() {
mongoTemplate.dropCollection(User.class);