Spring Mongodb findandModify无法更新整个文档

时间:2016-12-15 19:58:57

标签: spring mongodb spring-data-mongodb

我是mongodb的新手,并努力了解文档更新的工作原理。 我有一个名为' menu':

的文档
{
 "someId":"id123",
 "someProperty":"property123",
 "list" : [{
    "innerProperty":"property423"
 }]
}

映射到我的实体:

@Document(collection = "menu")
public class Menu {
 @Id
 private String id;
 private String someid;
 private String someProperty;
 private List<SomeClass> list;

 // accessors
}

当我尝试查找和更新此文档时,它不会更新文档。肯定会找到菜单,就像它返回带有Id的原始实体一样:

@Override
public Menu update(Menu menu) {
    Query query = new Query(
            Criteria.where("someId").is(menu.getSomeId()));
    Update update = Update.update("menu", menu);
    return mongoOperations.findAndModify(query, update,
            FindAndModifyOptions.options().returnNew(true), Menu.class);
}

但如果我将其更改为此,则可以:

@Override
public Menu update(Menu menu) {
    Query query = new Query(
            Criteria.where("someId").is(menu.getSomeId()));
    Update update = new Update().set("someProperty", menu.getSomeProperty())
     .set("list", menu.getList());
    return mongoOperations.findAndModify(query, update,
            FindAndModifyOptions.options().returnNew(true), Menu.class);
}

我不太喜欢第二种方法,其中文档的每个元素都是单独设置的,因为您可能会想到我有一个相当大的文档并且容易出错。

为什么第一种方法不起作用?什么是更新文档的更好方法?

1 个答案:

答案 0 :(得分:0)

签出findAndModify的文档-它会在修改之前返回文档的版本。如果此后立即执行新的find(),您将看到所做的更改实际上已保存到MongoDB。