首页 > 解决方案 > Spring Data 中的 MongoDB $addField 和 $indexOfArray

问题描述

根据 Asya Kamsky 的帖子,我正在尝试使用 MongoDB 和 Spring Data 实现自定义排序:

List<AggregationOperation> operations = new ArrayList<>();

operations.add(Aggregation.addFields().addField("scorrrz")
        .withValueOfExpression("{ \"$indexOfArray\" : [ [\"John\", \"Bill\"], \"$name\" ] }").build());

当我尝试执行此操作时,我得到:

ERROR a.insurance.misc.ErrorAttributes - /api/v1/insurance/opportunity/all
org.springframework.expression.spel.SpelParseException: Expression [{ "$indexOfArray" : [ ["John", "Bill"], "$name" ] }] @29: EL1043E: Unexpected token. Expected 'rsquare(])' but was 'comma(,)'

这不是正确的语法吗?Spring Data 如何做到这一点?

标签: mongodbspring-dataaggregation-frameworkspring-data-mongodb

解决方案


Collection<String> nameList = Arrays.asList("John", "Bill");

Aggregation agg = newAggregation(
                    addFields()
                     .addField("scorrrz").withValue(arrayOf(nameList).indexOf("$name"))
                     .build()
);

聚合的投影是一个$addFields具有$indexOfArray聚合数组操作的阶段。这将返回一个字段scorrrz,并且它将具有索引值 -1不匹配时。这在 Spring Boot v2.3.10 和 MongoDB v4.2.8 上运行良好。

运行此聚合将管道传递aggMongoTemplate#aggregate方法。


推荐阅读