+ *
+ * // { $and: [ { $gt: [ "$qty", 100 ] }, { $lt: [ "$qty", 250 ] } ] }
+ * expressionOf("qty > 100 && qty < 250);
+ *
+ * // { $cond : { if : { $gte : [ "$a", 42 ]}, then : "answer", else : "no-answer" } }
+ * expressionOf("cond(a >= 42, 'answer', 'no-answer')");
+ *
+ *
+ *
+ * @author Christoph Strobl
+ * @see SpelExpressionTransformer
+ * @since 1.10
+ */
+public class AggregationSpELExpression implements AggregationExpression {
+
+ private static final SpelExpressionTransformer TRANSFORMER = new SpelExpressionTransformer();
+ private final String rawExpression;
+ private final Object[] parameters;
+
+ private AggregationSpELExpression(String rawExpression, Object[] parameters) {
+
+ this.rawExpression = rawExpression;
+ this.parameters = parameters;
+ }
+
+ /**
+ * Creates new {@link AggregationSpELExpression} for the given {@literal expressionString} and {@literal parameters}.
+ *
+ * @param expression must not be {@literal null}.
+ * @param parameters can be empty.
+ * @return
+ */
+ public static AggregationSpELExpression expressionOf(String expressionString, Object... parameters) {
+
+ Assert.notNull(expressionString, "ExpressionString must not be null!");
+ return new AggregationSpELExpression(expressionString, parameters);
+ }
+
+ @Override
+ public DBObject toDbObject(AggregationOperationContext context) {
+ return (DBObject) TRANSFORMER.transform(rawExpression, context, parameters);
+ }
+}
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 c865f2a269..142e173526 100644
--- 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
@@ -37,6 +37,7 @@
import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBObject;
+import org.springframework.data.mongodb.test.util.BasicDbListBuilder;
/**
* Unit tests for {@link Aggregation}.
@@ -595,6 +596,27 @@ public void shouldHonorDefaultCountField() {
assertThat(project, isBsonObject().containing("count", 1));
}
+ /**
+ * @see DATAMONGO-1533
+ */
+ @Test
+ public void groupOperationShouldAllowUsageOfDerivedSpELAggregationExpression() {
+
+ DBObject agg = newAggregation( //
+ project("a"), //
+ group("a").first(AggregationSpELExpression.expressionOf("cond(a >= 42, 'answer', 'no-answer')")).as("foosum") //
+ ).toDbObject("foo", Aggregation.DEFAULT_CONTEXT);
+
+ @SuppressWarnings("unchecked")
+ DBObject secondProjection = ((List