Избегайте дублирования ключевой ошибки объемной вставки 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})