.save如何给出“重复键错误”?

时间:2019-09-05 14:33:15

标签: mongodb

我读到:.save检查是否存在与您保存的_id相同的_id的文档。 如果存在,它将替换。如果没有这样的文档,它将作为新文档插入。

但是当我这样做时:

barTable = new barModel(received.bar);
return resolve(barTable.save());

它与新记录配合使用很好,但是在保存现有记录时出现此错误:

{
    "err": true,
    "errMsg": "Error while barEdit: MongoError: E11000 duplicate key error collection: pattayanight.bar index: _id_ dup key: { : \"aa11\" }"
}

它为什么不像文档中所说的那样更新?

这是我的模特

var Schema      = mongoose.Schema;
var barSchema   = new Schema({
    _id:            String,
    type:           String,
    area:           String,
    shortText:      String 
}, { versionKey: false }); 
module.exports = mongoose.model('barModel', barSchema,'bar');

为什么我总是可以将findOneAndUpdate与upsert:true一起使用,但是.save为什么不更新现有记录?

1 个答案:

答案 0 :(得分:0)

看看这个答案,它可能会给你带来一些启发(评论也很有趣):

Answer

  

主要区别在于,使用.save()时,客户端代码中已经有一个对象,或者必须先从服务器检索数据,然后再写回整个内容。

     

另一方面,.update()不需要将数据从服务器加载到客户端。所有的交互都是在服务器端进行的,而无需检索到客户端。因此,在向现有文档中添加内容时,.update()可以非常有效。

     

此外,.update()有一个多重参数,该参数允许对多个符合查询条件的文档执行操作。

     

使用.update()进行调用时,便利方法中有些东西会松动,但是某些操作的好处是您必须承担“权衡”。有关此信息和可用选项的更多信息,请参阅文档。

     

简而言之,.save()是客户端接口,.update()是服务器端。