【问题标题】:Building ArrayFilters update in Spring Data MongoDB with MongoOperation使用 MongoOperation 在 Spring Data MongoDB 中构建 ArrayFilters 更新
【发布时间】: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"}

不确定是哪个字段出现错误。一些建议会有所帮助。

【问题讨论】:

    标签: java spring mongodb nosql spring-mongodb


    【解决方案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,了解如何将版本更新到支持的最新生产版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        • 2023-02-08
        • 1970-01-01
        • 2012-05-18
        相关资源
        最近更新 更多