使用 MongoOperation 在 Spring Data MongoDB 中构建 ArrayFilters 更新
Posted
技术标签:
【中文标题】使用 MongoOperation 在 Spring Data MongoDB 中构建 ArrayFilters 更新【英文标题】:Building ArrayFilters update in Spring Data MongoDB with MongoOperation 【发布时间】:2020-07-09 19:01:45 【问题描述】:我正在使用 Spring Boot 2.2.1.RELEASE
。如何使用 Spring MongoOperation 编写以下 MongoDB 更新查询
db.cities.updateOne(
_id : ObjectId("5e78ec62bb5b406776e92fac")
,
$inc:
"subscriptions.$[category].subscribers" : 1,
"subscriptions.$[category].options.$[option].subscribers" : 1
,
multi: true,
arrayFilters: [
"category._id": $in: ["1", "2"] ,
"option.name": $in: ["Time", "Gourmand", "Politics", "Entrepreneurship"]
]
)
我已经尝试了以下
Update update = new Update().inc("subscriptions.$[category].subscribers", 1).inc("subscriptions.$[category].options.$[option].subscribers", 1).filterArray(Criteria.where("category._id").in(Arrays.asList("1", "2")).andOperator(Criteria.where("option.name").in(Arrays.asList("Time", "Gourmand", "Politics", "Entrepreneurship"))));
UpdateResult result = mongoOperations.updateFirst(new Query(where("id").is(cityId)), update, CitiesDoc.class);
但我不断收到以下错误
org.springframework.dao.InvalidDataAccessApiUsageException:命令失败,出现错误 9 (FailedToParse):服务器 localhost:56740 上的“更新操作中无法识别的字段:arrayFilters”。完整的响应是 "ok": 0.0, "errmsg": "Unrecognized field in update operation: arrayFilters", "code": 9, "codeName": "FailedToParse";嵌套异常是 com.mongodb.MongoCommandException:命令失败并出现错误 9 (FailedToParse):服务器 localhost:56740 上的“更新操作中无法识别的字段:arrayFilters”。完整的响应是 "ok": 0.0, "errmsg": "Unrecognized field in update operation: arrayFilters", "code": 9, "codeName": "FailedToParse"
不确定是哪个字段出现错误。一些建议会有所帮助。
【问题讨论】:
【参考方案1】:将以下内容添加到application.yaml
:
spring:
mongodb:
embedded:
version: 4.0.2
【讨论】:
【参考方案2】:它适用于以下查询
update = update.inc("subscriptions.$[category].subscribers", 1);
update = update.inc("subscriptions.$[category].options.$[option].subscribers", 1);
update = update.filterArray(Criteria.where("category._id").in(Arrays.asList("1", "2")));
update = update.filterArray(Criteria.where("option.name").in(Arrays.asList("Time", "Gourmand", "Politics", "Entrepreneurship")));
UpdateResult result = mongoOperations.updateFirst(new Query(where("id").is(cityId)), update, CitiesDoc.class);
但错误的原因是 MongoDB 版本。我使用 flabdoodle 作为嵌入式 MongoDB 进行测试。并且默认的 MongoDB 版本是 3.5.5。我相信不支持arrayFilters
。将版本更新到 4.x 解决了该问题。您可以查看此answer,了解如何将版本更新到支持的最新生产版本。
【讨论】:
以上是关于使用 MongoOperation 在 Spring Data MongoDB 中构建 ArrayFilters 更新的主要内容,如果未能解决你的问题,请参考以下文章