Skip to content

Commit 84cc3be

Browse files
Add support for $documentNumber aggregation operator.
Closes: #3717
1 parent 708cca7 commit 84cc3be

File tree

4 files changed

+37
-0
lines changed

4 files changed

+37
-0
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/DocumentOperators.java

+26
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import org.bson.Document;
1919

2020
/**
21+
* Gateway to {@literal document expressions} such as {@literal $rank, $documentNumber, etc.}
22+
*
2123
* @author Christoph Strobl
2224
* @since 3.3
2325
*/
@@ -43,6 +45,16 @@ public static DenseRank denseRank() {
4345
return new DenseRank();
4446
}
4547

48+
/**
49+
* Obtain the current document position.
50+
*
51+
* @return new instance of {@link DocumentNumber}.
52+
* @since 3.3
53+
*/
54+
public static DocumentNumber documentNumber() {
55+
return new DocumentNumber();
56+
}
57+
4658
/**
4759
* {@link Rank} resolves the current document position (the rank) relative to other documents. If multiple documents
4860
* occupy the same rank, {@literal $rank} places the document with the subsequent value at a rank with a gap.
@@ -73,4 +85,18 @@ public Document toDocument(AggregationOperationContext context) {
7385
return new Document("$denseRank", new Document());
7486
}
7587
}
88+
89+
/**
90+
* {@link DocumentNumber} resolves the current document position.
91+
*
92+
* @author Christoph Strobl
93+
* @since 3.3
94+
*/
95+
public static class DocumentNumber implements AggregationExpression {
96+
97+
@Override
98+
public Document toDocument(AggregationOperationContext context) {
99+
return new Document("$documentNumber", new Document());
100+
}
101+
}
76102
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/MethodReferenceNode.java

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public class MethodReferenceNode extends ExpressionNode {
7171
// DOCUMENT OPERATORS
7272
map.put("rank", emptyRef().forOperator("$rank"));
7373
map.put("denseRank", emptyRef().forOperator("$denseRank"));
74+
map.put("documentNumber", emptyRef().forOperator("$documentNumber"));
7475

7576
// ARITHMETIC OPERATORS
7677
map.put("abs", singleArgRef().forOperator("$abs"));

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/DocumentOperatorsUnitTests.java

+5
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@ void rendersDenseRank() {
3636
assertThat(denseRank().toDocument(Aggregation.DEFAULT_CONTEXT))
3737
.isEqualTo(new Document("$denseRank", new Document()));
3838
}
39+
40+
@Test // GH-3717
41+
void rendersDocumentNumber() {
42+
assertThat(documentNumber().toDocument(Aggregation.DEFAULT_CONTEXT)).isEqualTo(new Document("$documentNumber", new Document()));
43+
}
3944
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformerUnitTests.java

+5
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,11 @@ void shouldRenderDenseRank() {
956956
assertThat(transform("denseRank()")).isEqualTo(Document.parse("{ $denseRank : {} }"));
957957
}
958958

959+
@Test // GH-3717
960+
void shouldRenderDocumentNumber() {
961+
assertThat(transform("documentNumber()")).isEqualTo(Document.parse("{ $documentNumber : {} }"));
962+
}
963+
959964
private Object transform(String expression, Object... params) {
960965
Object result = transformer.transform(expression, Aggregation.DEFAULT_CONTEXT, params);
961966
return result == null ? null : (!(result instanceof org.bson.Document) ? result.toString() : result);

0 commit comments

Comments
 (0)