Spring Mongodb findandModify 无法更新整个文档
Spring Mongodb findandModify fails to update entire document
我是 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
}
当我尝试像这样查找和更新此文档时,它没有更新文档。它确实找到了菜单,因为它 returns 带有 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);
}
我不太喜欢第二种方法,其中文档的每个元素都是单独设置的,因为您可能认为我有一个相当大的文档并且容易出错。
为什么第一种方法不行?什么是更新文档的更好方法?
查看 findAndModify 的文档 - 它 returns 文档的版本 在 字段被修改之前。如果您之后直接执行新的 find()
,您会看到您的更改实际上已保存到 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
}
当我尝试像这样查找和更新此文档时,它没有更新文档。它确实找到了菜单,因为它 returns 带有 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);
}
我不太喜欢第二种方法,其中文档的每个元素都是单独设置的,因为您可能认为我有一个相当大的文档并且容易出错。
为什么第一种方法不行?什么是更新文档的更好方法?
查看 findAndModify 的文档 - 它 returns 文档的版本 在 字段被修改之前。如果您之后直接执行新的 find()
,您会看到您的更改实际上已保存到 MongoDB。