猫鼬文档中的错误?模型 save() numberAffected 1 用于更新而不是创建?

Posted

技术标签:

【中文标题】猫鼬文档中的错误?模型 save() numberAffected 1 用于更新而不是创建?【英文标题】:Error in Mongoose Documentation? Model save() numberAffected 1 for update rather creation? 【发布时间】: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

【问题讨论】:

【参考方案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。

以上是关于猫鼬文档中的错误?模型 save() numberAffected 1 用于更新而不是创建?的主要内容,如果未能解决你的问题,请参考以下文章

cart.save() 不是更新文档的函数

如何更新具有嵌入文档的猫鼬数组中的许多元素

如何在猫鼬中填充另一个模型的子文档?

猫鼬模式预保存中的 ESLint 意外“this”错误

猫鼬保存()不返回承诺

用打字稿中的子文档描述猫鼬模型