Избегайте дублирования ключевой ошибки объемной вставки mongodb

как я могу выполнить массовую вставку и продолжить в случае дублирования ключевой ошибки?

У меня есть коллекция с уникальным индексом в поле id ( not _id) и некоторыми данными в нем. Затем я получаю больше данных, и я хочу добавить в коллекцию только несуществующие документы.

У меня есть следующий код:

let opts = {
  continueOnError: true, // Neither
  ContinueOnError: true, // of
  keepGoing: true,       // this
  KeepGoing: true,       // works
};
let bulk = collection.initializeUnorderedBulkOp( opts );
bulk.insert( d1 );
bulk.insert( d2 );
bulk.insert( d3 );
...
bulk.insert( dN );
let result = yield bulk.execute( opts ); // this keep throwing duplicate key error

И я просто хотят игнорировать ошибки и позволить массовому завершению со всеми операциями в очереди.

Я искал в npm module api и в MongoDB api для Bulk, initializeUnorderedBulkOp и документы для Массовая запись без везения.


Также в документах для неупорядоченных операций они говорят:

Обработка ошибок

Если во время обработки одной из операций записи произошла ошибка, MongoDB продолжит обработку оставшихся операций записи в списке.

Это неверно (по крайней мере, в моем случае): (

Любые идеи приветствуются!

Ответ 1

Вы можете использовать db.collection.insertMany(), (новое в версии 3.2.) С:

ordered:false

При значении false и в случае ошибки дублирующего ключа операция вставки будет продолжена для всех оставшихся документов.

Вот ссылка на документацию:https://docs.mongodb.com/v3.2/reference/method/db.collection.insertMany/

Ответ 2

Упорядоченная вставка в MongoDB

db.hobbies.insertMany([{_id: "yoga", name: "Yoga"}, {_id: "cooking", name: "Cooking"}, {_id: "hiking", name: "Hiking"}], {ordered: true})

{order: true} - поведение операторов вставки по умолчанию

Неупорядоченная вставка в MongoDB

Если вы хотите, чтобы mongodb продолжал пытаться вставлять другие документы даже после одного или нескольких сбоев по какой-либо причине, вы должны установить для значение false. Смотрите пример ниже:

db.hobbies.insertMany([{_id: "yoga", name: "Yoga"}, {_id: "cooking", name: "Cooking"}, {_id: "hiking", name: "Hiking"}], {ordered: false})