【问题标题】:How can .save give a "duplicate key error"?.save 如何给出“重复键错误”?
【发布时间】:2020-01-08 11:48:26
【问题描述】:

我读到: .save 检查是否存在与您保存的文档具有相同 _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 不更新现有记录?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

    Answer

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

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

    此外,.update() 的 multi 参数允许对多个与查询条件匹配的文档执行操作。

    在使用 .update() 作为调用时,您会在便捷方法中失去一些东西,但某些操作的好处是您必须承担的“权衡”。有关这方面的更多信息以及可用选项,请参阅文档。

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

    【讨论】:

    • 是的,我明白这一点,但它仍然没有解释使用 .save 时的“重复键错误”,因为即使它是客户端,它也应该(根据文档)仍然替换任何现有记录,对吗?
    • 也许您遇到了问题,因为您手动设置了_id。你不需要声明它,因为 mongoDB 会自动设置_id
    • 在我的情况下,我必须设置它,因为我将它用于 barName - 它应该仍然有效
    • 我建议你创建一个名为 name 的字段并让 mongoDB 设置自己的 _id
    猜你喜欢
    • 2017-12-27
    • 1970-01-01
    • 2019-03-15
    • 2016-08-27
    • 1970-01-01
    • 2013-09-14
    • 2011-09-16
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多