2015-10-23 4 views
4

Предположим, у меня есть список документов, которые я хочу вставить.MongoDB пакетная вставка с уникальным индексом

документы имеют структуру, как следовать

{ 
    url: string, 
    visited: boolean 
} 

У меня есть уникальный индекс по ключу url.

Когда я вставляю документы, если обнаружено 1 дубликат, вся операция прерывается.

Есть ли способ, которым я все еще могу использовать пакетную вставку, и он будет вставлять все документы, которые не дублируются?

Как обходной путь, я должен вставлять документы один за другим, и я боюсь влияния производительности накладных расходов.

ответ

3

Предположим, у меня есть коллекция с уникальным индексом на поле с именем a, как показывают по выходу .getIndexes()

> db.collection.getIndexes() 
[ 
     { 
       "v" : 1, 
       "key" : { 
         "_id" : 1 
       }, 
       "name" : "_id_", 
       "ns" : "test.collection" 
     }, 
     { 
       "v" : 1, 
       "unique" : true, 
       "key" : { 
         "a" : 1 
       }, 
       "name" : "a_1", 
       "ns" : "test.collection" 
     } 
] 

и следующий массив документов:

var docs = [ { 'a': 3 }, { 'a': 4 }, { 'a': 3 } ]; 

Вы можете используйте API Bulk(), чтобы вставить объемные вставки этих документов в свою коллекцию, но вам нужно использовать unordered operations, которые позволяют MongoD B, чтобы продолжить обработку оставшихся операций записи в списке, даже если при обработке одной из операций записи произошла ошибка.

var docs = [{a: 3}, {a: 4}, {a: 3}] 
var bulk = db.collection.initializeUnorderedBulkOp(); 
for(var ind=0; ind<docs.length; ind++) { 
    bulk.insert(docs[ind]); 
} 
bulk.execute(); 

вы получите сообщение об ошибке, после выполнения запроса документов, но не дублирует будет вставить в вашей коллекции.

Вот наша коллекция была пуста перед операцией, но после вызова bulk.execute()db.collection.find() дает следующие документы:

{ "_id" : ObjectId("5629c5d1e6d6a6b8e38d013c"), "a" : 3 } 
{ "_id" : ObjectId("5629c5d1e6d6a6b8e38d013d"), "a" : 4 } 
Смежные вопросы