【问题标题】:How to modify array same values based on $如何根据 $ 修改数组相同的值
【发布时间】:2020-04-13 11:42:02
【问题描述】:

我尝试使用以下方法修改数组值:

        final UpdateResult ur = operations.updateMulti(
                new Query().addCriteria(
                        Criteria.where("tags.applications").in(Collections.singletonList(4))),
                new Update().set(String.format("%s.$","tags.applications"), 8),
                "testMetaModel");

问题是,如果数组像 tag: application: [1,2,3,4,4,5,6] 如果我使用上面的“$”更新,它只能更新第一个匹配的“4”,但我想将所有“4”更新为“8”,我该怎么办? 我使用弹簧 MongoTemplate。

【问题讨论】:

标签: java mongodb spring-data


【解决方案1】:

我使用了位置过滤器,参考here

外壳查询:

db.demo.update(
  {},
  {
    $set:{
      "a.$[element]":8
    }
  },
  {
    arrayFilters:[
      {
        "element":4
      }
    ]
  }
)

这将更新提供的数组中的所有匹配元素。

上面的 shell 查询工作正常。您可以将其与您的弹簧数据集成。我尝试在 springdata 中添加它,但如果遇到任何问题,请根据我提供的 shell 查询修复它。 :)

Update update=new Update().set("tags.applications.$[element]", 8).filterArray(Criteria.where("element").is(4)); 
final UpdateResult ur = operations.updateMulti(
        new Query(),
        update,
        "testMetaModel");

更新

Java驱动查询:

db.getCollection("demo").updateMany(
        new Document(),
        new Documen("$set", new Document("a.$[element]", 8)),
        new UpdateOptions().arrayFilters(
            Arrays.asList( 
            Document.parse("{'element': 4}")
            )
        )
);

【讨论】:

  • 我好像没有方法:"update.filterArray(Criteria.where("element")." ? 怎么办
  • 好像spring数据没有UpdateOptions。您可以使用 java 驱动程序来更新文档。请参考这个stackoverflow.com/a/55503265/8383549
  • 我已使用 java 驱动程序查询更新了我的答案。希望这会对你有所帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2023-02-14
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2015-05-18
相关资源
最近更新 更多