Spring Data MongoDB聚合:Lookup后编写replaceRoot与mergeObjects的方法
Spring Data MongoDB 聚合管道中ReplaceRoot阶段的正确写法
需求场景
在Lookup聚合阶段之后,需要添加replaceRoot阶段,对应Mongo Shell的实现代码如下:
{ $replaceRoot: {'newRoot': {'$mergeObjects': [{'$arrayElemAt': ['$joined',0]},'$$ROOT']}}
错误的尝试代码
Aggregation.replaceRoot().withValueOf(ArithmeticOperators.arrayElementAt(ArrayOperators.Size.lengthOfArray("joined").arrayOfLength(1),0).and("$$ROOT").mergeObjects())
正确实现方式
方式一:直接构建MongoDB原生Document表达式
Aggregation.replaceRoot() .withValue(AggregationExpression.from( context -> new Document("$mergeObjects", Arrays.asList( new Document("$arrayElemAt", Arrays.asList("$joined", 0)), "$$ROOT" )) ))
方式二:使用Spring Data MongoDB提供的操作符组合
import org.springframework.data.mongodb.core.aggregation.ArrayOperators; import org.springframework.data.mongodb.core.aggregation.MergeObjects; import org.springframework.data.mongodb.core.aggregation.Variables; // ... Aggregation.replaceRoot() .withValue(MergeObjects.mergeObjects( ArrayOperators.ArrayElemAt.arrayOf("joined").elementAtPosition(0), Variables.RECURSIVE_ROOT ))
错误原因说明
之前的代码存在两处核心问题:
- 错误使用了
ArithmeticOperators.arrayElementAt,这是用于算术运算的操作符,正确的数组取元素操作符应该是ArrayOperators.ArrayElemAt; ArrayOperators.Size.lengthOfArray("joined").arrayOfLength(1)是用来获取数组长度的逻辑,并非取数组的第一个元素,完全偏离了需求逻辑。
内容的提问来源于stack exchange,提问作者Alan Jurgensen
相关产品推荐
相关产品推荐

