使用 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 更新的主要内容,如果未能解决你的问题,请参考以下文章

cas完全是sprin框架写的么

我正在尝试在我的 sprin 启动应用程序中应用 auth0 安全性,但它会引发错误

Sprin中Bean的顺序

Sprin学习一

sprin boot 配置文件的获取顺序

SPRIN06_源码之核心组件接口BeanDefinitionDebug创建流程流程图总结