mongodb - 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 如何做到这一点?
解决方案
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 上运行良好。
运行此聚合将管道传递agg
给MongoTemplate#aggregate
方法。
推荐阅读
- sql-server - 连接池可以同时为多个事务提供相同的连接吗?
- python - 不再满足条件时重置的累积和
- angular - Angular 7 swUpdate 打破了单元测试,不能模拟/覆盖测试(PWA)
- linux - 具有非阻塞套接字的 Kqueue/epoll (FreeBSD/Linux):写入/发送/发送后何时可以释放缓冲内存?
- azure-active-directory - MSAL TokenAcquisition 从文件中存储的令牌中获取
- asp.net - 如何处理每个请求的会话 Asp.net mvc
- java - 当其他人点击他们想去的点时如何进行路线申请
- matlab - Matlab - 如何用扭曲的图像变换点
- c - 是否有可能在 5*5 矩阵中使用共阳极配置以方形发光 LED
- java - 创建弹出窗口的问题