findById()+ save()与MongoDB中的update()有何不同

时间:2016-07-21 21:55:31

标签: mongodb mongoose

在尝试使用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" }] } } } 。就在那时我觉得找到一个文档更容易,以任何我想要的方式操作它然后保存它。在那种情况下,我不知道是否有任何其他选择来更新文档。

1 个答案:

答案 0 :(得分:2)

我通常喜欢在执行更精细的更新时使用findById(),并且不认为您遗漏任何根本重要的内容。

然而,在mongoose中需要注意的一个方法是findByIdAndUpdate(),这会发出一个mongodb findAndModify更新命令,并允许您使用以下代码执行第一个示例:Category.findByIdAndUpdate("123", function(err, savedDoc) {...})