+ *
+ * // { $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 Document toDocument(AggregationOperationContext context) {
+ return (Document) 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 dbf54380d..92d01d71f 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
@@ -393,6 +393,7 @@ public class AggregationUnitTests {
Document group = extractPipelineElement(agg, 1, "$group");
assertThat(getAsDocument(group, "count"), is(new Document().append("$sum", "$tags_count")));
}
+
/**
* @see DATAMONGO-861
*/
@@ -590,6 +591,27 @@ public class AggregationUnitTests {
assertThat(project, isBsonObject().containing("count", 1));
}
+ /**
+ * @see DATAMONGO-1533
+ */
+ @Test
+ public void groupOperationShouldAllowUsageOfDerivedSpELAggregationExpression() {
+
+ Document agg = newAggregation( //
+ project("a"), //
+ group("a").first(AggregationSpELExpression.expressionOf("cond(a >= 42, 'answer', 'no-answer')")).as("foosum") //
+ ).toDocument("foo", Aggregation.DEFAULT_CONTEXT);
+
+ @SuppressWarnings("unchecked")
+ Document secondProjection = ((List