Mongoose/MongoDB бросает повторяющуюся ключевую ошибку при сохранении?

В соответствии с документацией MongoDB вызов save создаст новый документ или обновит существующий документ, если будет предоставлен _id. Документация Mongoose менее подробно и не учитывает, будет ли она вставляться или обновляться.

Я пытаюсь использовать функцию Mongoose save для обновления документа, но я продолжаю получать ошибку:

{ "error": { "name": "MongoError", "code": 11000, "err": "insertDocument:: вызванный: 11000 E11000 дубликат ключевой индекс ошибки: staging.participants. $_ id _ dup key: {: ObjectId ('5515a34ed65073ec234b5c5f')}" }}

Функция Mongoose save выполняет функцию upsert, например MongoDB save, или просто выполняет вставку?

Ответы

Ответ 1

Что определяет, будет ли save будет вставка или обновление, это флаг isNew, как вы можете видеть здесь.

Этот флаг автоматически устанавливается на false, когда экземпляр документа возвращается из запроса find (или любого его варианта). Если вы вручную создаете документ, попробуйте установить этот флаг в значение false перед его сохранением:

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

Существует также функция init, которая инициализирует документ и автоматически устанавливает isNew в false:

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