1

我读到: .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 怎么不更新现有记录?

4

1 回答 1

0

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

回答

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

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

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

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

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

于 2019-09-05T14:49:30.470 回答