【问题标题】:How is findById() + save() different from update() in MongoDBfindById() + save() 与 MongoDB 中的 update() 有何不同
【发布时间】:2016-07-29 03:27:10
【问题描述】:

在尝试使用 Mongoose 更新 MongoDB 文档时,我可以在回调中使用 findById()save(),还是应该坚持使用传统的更新方法,例如 findByIdAndModifyfindOneAndModifyupdate() , 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 我更新了一个更详细的示例文档和所需的操作,它们构成了我的问题的基础。

标签: mongodb mongoose


【解决方案1】:

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

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

【讨论】:

  • 我也看过findByIdAndUpdate(),但其中一个限制是,如果满足特定查询条件,则必须执行更新,这不仅仅是通过其 ID 值查找文档。跨度>
猜你喜欢
  • 2012-03-07
  • 2011-09-19
  • 2017-04-06
  • 2013-12-04
  • 1970-01-01
  • 2019-06-17
  • 2016-01-06
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多