2016-10-08 2 views
0

Основной целью: Вставка несколько документов одновременно, но обеспечить только уникальные, которые хранятся в коллекции Объяснения нижеКоллекция вставка несколько - обеспечить уникальность

Я вставив много документов в коллекцию MongoDB сразу как так:

db.users.insert([{name: 'Joe'}{'name': 'Bob'}]); 

Некоторые из значений, идущих во вставку может быть дубликатом и я хотел бы MongoDB игнорировать их. Это необходимо для обеспечения уникальности коллекции.

db.users.insert([{name: 'Joe'}{'name': 'Jack'}]); 

с использованием индексу всей .insert() операции будет выполнено, если вся вставка не является уникальной, а не только не являющимися уникальными предметами игнорируются.

db.users.createIndex({ 'name': 1 }, { unique: true }); 

Вход с MongoDB:

BulkWriteResult({ 
    "writeErrors" : [ 
     { 
      "index" : 0, 
      "code" : 11000, 
      "errmsg" : "E11000 duplicate key error collection: test.users index: name_1 dup key: { : \"Joe\" }", 
      "op" : { 
       "_id" : ObjectId("57f924ee7d864acfefaca700"), 
       "name" : "joe" 
      } 
     } 
    ], 
    "writeConcernErrors" : [ ], 
    "nInserted" : 0, 
    "nUpserted" : 0, 
    "nMatched" : 0, 
    "nModified" : 0, 
    "nRemoved" : 0, 
    "upserted" : [ ] 
}) 

Есть еще один способ сделать это?

+0

Что вы действительно хотите? пожалуйста, уточните его больше –

+0

@WasiqMuhammad Я думал, что вопрос был довольно ясным ... Я хочу вставлять сразу несколько документов, но при этом в коллекции хранятся только уникальные. Добавив это в вопрос post – Monokh

ответ

0

Для людей, которые ищут ответ на этот вопрос. В конечном итоге я использую операцию update.upsert(). Это означало, что я мог бы хранить свою ограниченную коллекцию, убедиться, что она была заказана, и для всей операции все еще оставалась навалом.

Это устранило необходимость в уникальном индексе, так как upsert всегда обновляет/вставляет данные, гарантируя, что у нас нет дубликатов. Операция поиска должна включать уникальные ключи.

const bulk = db.collection.initializeOrderedBulkOp(); 
bulk.find({name: 'Joe'}).upsert().updateOne({name: 'Joe'}); 
bulk.find({name: 'Bob'}).upsert().updateOne({name: 'Bob'}); 
bulk.find({name: 'Jack'}).upsert().updateOne({name: 'Jack'}); 
bulk.execute(); 
0

Забудьте комментарий. Может быть, вы смотрите на что-то вроде этого. UnorderedBulkOp

Магические имена из неупорядоченных объемных операций происходят параллельно. если один (или некоторый) из них fai, MongoDB продолжит с остальными и кричит ошибки в конце.

+0

, у меня есть ограниченная коллекция, поэтому на самом деле это важно для операции, которую нужно заказать :(глядя на документы, хотя кажется, что я мог бы просто использовать упорядоченную массовую операцию вместо этого? – Monokh

+0

На самом деле это не собирается Теперь я вижу, почему вы рекомендовали здесь неупорядоченные массовые операции ... «Если во время обработки одной из операций записи возникает ошибка, MongoDB вернется без обработки оставшихся операций записи в списке». Может быть, единственный способ вставьте один за другим, затем – Monokh

0

Для ввода нескольких документов с помощью уникального ключа вы можете создать индекс, в котором вы можете объявить этот ключ уникальным. Как и в вашем случае, вы можете создать индекс, используя эту команду,

db.users.createIndex ({ "имя": 1}, {уникальный: истинный})

+0

Эта строка буквально находится в сообщении ... Я уже делал это – Monokh

Смежные вопросы