首页 文章

Mongoose / MongoDB在保存时抛出重复键错误?

提问于
浏览
19

根据MongoDB's documentation,调用 save 将创建一个新文档,或者如果提供了 _id 则更新现有文档 . Mongoose的文档是less detailed,并没有考虑它是否会插入或更新 .

我试图使用Mongoose的 save 函数来更新文档,但我一直收到错误:

{“error”:{“name”:“MongoError”,“code”:11000,“err”:“insertDocument ::由:: 11000 E11000引起的重复键错误索引:staging.participants . $ _ id _ dup key: {:ObjectId('5515a34ed65073ec234b5c5f')}“}}

Mongoose的 save 函数是否像MongoDB的 save 函数一样执行upsert,还是执行插入?

1 回答

  • 21

    什么定义 save 将是插入还是更新是 isNew 标志,因为你可以see here .

    当从 find 查询(或其任何变体)返回文档实例时,此标志自动设置为 false . 如果要手动实例化文档,请在保存之前尝试将此标志设置为false:

    var instance = new Model({ '_id': '...', field: '...' });
    instance.isNew = false;
    instance.save(function(err) { /* ... */ });
    

    还有一个 init 函数,它将初始化文档和automatically set isNew to false

    var data = { '_id': '...', field: '...' };
    var instance = new Model();
    instance.init(data, {}, function(err) {
        instance.save(function(err) { /* ... */ })
    });
    

相关问题