【问题标题】:Error in Mongoose Documentation? Model save() numberAffected 1 for update rather creation?猫鼬文档中的错误?模型 save() numberAffected 1 用于更新而不是创建?
【发布时间】:2014-07-29 13:49:44
【问题描述】:

对 Mongoose 文档感到困惑......它为 model.js save() 声明:

product.sold = Date.now();
product.save(function (err, product, numberAffected) {
  if (err) ..
})

回调将接收三个参数,如果发生错误则为err,product为保存的产品,numberAffected在数据库中找到并更新文档时为1,否则为0。

当我在我的模型/数据库中插入一个新文档时,我得到 numberAffected 1。但是从文档中,如果找到该文档,则为 1...这是否意味着该文档之前存在并且它会更新而不是创造?

需要明确的是,我创建的文档始终是新的,绝不是预先存在的。从来没有预先存在的文档被更新而不是插入。然而,我得到 numberAffected 1

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    不,它不会,原因是.save() 更像是.update() 的便利包装,但包括“upsert”功能。可以这样想:

    Model.update(
        { _id: obj._id }, 
        obj, 
        { upsert: true },
        function(err,numAffected) {
    
           return [err, obj, numAffected];
        }
    )
    

    不完全是实现,但它有助于以这种方式可视化。

    所以第三个参数是受影响的数字,但是是“更新”部分,如果这导致一个实际上被“更新”的新文档,则该参数为 0。与 .update() 方法返回的值非常相似,该值将是受更新影响的文档数,但仅限于“更新”应用于现有文档的情况。

    【讨论】:

    • 如何判断/获取返回值以表明文档是否存在并已更新,或者是否使用模型 api save() 创建了新文档?
    • @dman 正如已经说明的那样。如果回调中的 numAffected 值为 0,则文档已插入。如果不是和 1 则它已经存在。
    • 我没有看到它。我的文档总是新的并且被插入...从来没有更新过的预先存在的文档...但是返回 numberAffected 1。
    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 2016-10-06
    • 2016-05-24
    • 2016-01-23
    • 1970-01-01
    • 2018-08-20
    • 2018-08-27
    • 2014-12-04
    相关资源
    最近更新 更多