【发布时间】:2016-07-29 03:27:10
【问题描述】:
在尝试使用 Mongoose 更新 MongoDB 文档时,我可以在回调中使用 findById() 和 save(),还是应该坚持使用传统的更新方法,例如 findByIdAndModify、findOneAndModify、update() , ETC。?假设我想更新以下文档的 name 字段(请在最后的编辑中查看更详细的示例,这激发了我的问题):
{
"_id": ObjectId("123"),
"name": "Development"
}
(该系列的 Mongoose 型号名称为 Category)
我可以这样做:
Category.update({ "_id" : "123" }, { "name" : "Software Development" }, { new: true })
或者我可以这样做:
Category.findById("123", function(err, category) {
if (err) throw err;
category.name = "Software Development";
category.save();
});
对于更详细的示例,操作一个可以简单保存的 JavaScript 对象感觉更容易,而不是为.update() 操作设计一个相对复杂的更新文档。我是否遗漏了一些根本上重要的东西?
于 2016 年 7 月 21 日编辑回应@Cameron 的评论,我认为有必要提供一个更好的例子:
{
"_id": ObjectId("123"),
"roles": [{
"roleId": ObjectId("1234"),
"name": "Leader"
}, {
"roleId": ObjectId("1235"),
"name": "Moderator"
}, {
"roleId": ObjectId("1236"),
"name": "Arbitrator"
}]
}
我要做的是在单个操作中删除一些角色以及在roles 子文档数组中添加一些角色。要添加角色子文档,可以使用$push,要删除角色子文档,可以使用$pull。但如果我做了这样的事情:
Person.update({
"_id": "123"
}, {
$pull : {
"roles" : {
"roleId" : {
$in : [ "1235", "1236" ]
}
}
},
$push : {
"roles" : {
$each: [{
"roleId" : ObjectId("1237"),
"name" : "Developer"
}]
}
}
}
当我尝试执行此操作时,当然会收到错误Cannot update 'roles' and 'roles' at the same time。那时我觉得找到一个文档,以任何我想要的方式操作它然后保存它更容易。在那种情况下,我不知道是否真的有任何其他选择来更新文档。
【问题讨论】:
-
除了原子性问题之外,既然可以只用一次,为什么还要两次往返数据库?
-
@Cameron 我更新了一个更详细的示例文档和所需的操作,它们构成了我的问题的基础。