在尝试使用Mongoose更新MongoDB文档时,我可以在回调中使用findById()
save()
,还是应该坚持使用传统的更新方法,例如findByIdAndModify
,{ {1}},findOneAndModify
等?假设我想要更新以下文档的update()
字段(请在最后的编辑中查看更详细的示例,这会激发我的问题):
name
(集合的Mongoose模型名称为{
"_id": ObjectId("123"),
"name": "Development"
}
)
我可以这样做:
Category
或者我可以这样做:
Category.update({ "_id" : "123" }, { "name" : "Software Development" }, { new: true })
对于更详细的示例,操作可以简单保存的JavaScript对象感觉更容易,而不是为Category.findById("123", function(err, category) {
if (err) throw err;
category.name = "Software Development";
category.save();
});
操作设计相对复杂的更新文档。我错过了一些至关重要的东西吗?
2016年7月21日编辑回应@Cameron的评论,我认为有必要提供更好的例子:
.update()
我要做的是删除一些角色,并在单个操作中在{
"_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"
}]
}
}
}
。就在那时我觉得找到一个文档更容易,以任何我想要的方式操作它然后保存它。在那种情况下,我不知道是否有任何其他选择来更新文档。
答案 0 :(得分:2)
我通常喜欢在执行更精细的更新时使用findById()
,并且不认为您遗漏任何根本重要的内容。
然而,在mongoose中需要注意的一个方法是findByIdAndUpdate()
,这会发出一个mongodb findAndModify
更新命令,并允许您使用以下代码执行第一个示例:Category.findByIdAndUpdate("123", function(err, savedDoc) {...})
。