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)
但是,我在生成正确的查询/标准时遇到了麻烦。
提前致谢。
您应该尝试下一个查询:
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)