如何使用Spring + Mongo更新并添加到子文档列表

Man*_*tel 3 java spring-data spring-mongo

我在MongoDB集合中有一个像这样的文档:

{
  id : ... 
  listA:[{
          id: ...,
          thing:...,
          listB:[{...},{...}]
          },...
            ]
}
Run Code Online (Sandbox Code Playgroud)

(顶级ID是正常自动生成的MongoDB ID。子文档对象的另一个ID是我分别生成并推送到列表中的伪ID)

问题:我想(1)添加到listB(2)更改thing

该对象可能非常笨重,并且可能有多个线程正在该对象上运行,因此我想避免先发生findOne,先更新后再save发生场景类型。

我想在Spring Data中以与推送到相似的方式进行操作listA,即

@Autowired
private MongoOperations operations;

public void addStuff(String id, Stuff stuff) {
    operations.updateFirst(Query.query(Criteria.where("_id").is(id)),
            new Update().addToSet("listA", stuff), Stuffs.class);
}
Run Code Online (Sandbox Code Playgroud)

但是,我在生成正确的查询/标准时遇到了麻烦。

提前致谢。

Ore*_*est 6

您应该尝试下一个查询:

final Query query = new Query(new Criteria().andOperator(
        Criteria.where("_id").is("id"),
        Criteria.where("listA").elemMatch(Criteria.where("_id").is("id"))
));

final Update update = new Update().addToSet("listA.$.listB", stuff).set("listA.$.thing", "thing");

final WriteResult wr = mongoOperations.updateFirst(query, update, "collectionName");
Run Code Online (Sandbox Code Playgroud)