Подтвердить что ты не робот

Как остановить вставку дубликатов документов в коллекцию mongodb

У нас есть коллекция MongoDB, которая имеет три документа.

db.collection.find()

 { _id:'...', user: 'A', title: 'Physics',   Bank: 'Bank_A' }
 { _id:'...', user: 'A', title: 'Chemistry', Bank: 'Bank_B' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }

У нас есть doc,

 doc = { user: 'B', title: 'Chemistry', Bank:'Bank_A' }

Если мы используем

 db.collection.insert(doc) 

здесь этот дубликат doc будет вставлен в базу данных.

 { _id:'...', user: 'A', title: 'Physics',   Bank: 'Bank_A' }
 { _id:'...', user: 'A', title: 'Chemistry', Bank: 'Bank_B' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }

Как этот дубликат можно остановить. В каком поле должно выполняться индексирование или какой-либо другой подход?

4b9b3361

Ответ 1

Не используйте вставку.

Используйте обновить с помощью upsert=true. Обновление будет искать документ, соответствующий вашему запросу, затем он изменит нужные вам поля, а затем вы можете сказать об этом: True, если вы хотите вставить, если документ не соответствует вашему запросу.

db.collection.update(
   <query>,
   <update>,
  {
    upsert: <boolean>,
     multi: <boolean>,
    writeConcern: <document>
   }
  )

Итак, для вашего примера вы можете использовать что-то вроде этого:

db.collection.update(doc, doc, {upsert:true})

Ответ 2

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

db.collection.ensureIndex( { user: 1, title: 1, Bank: 1 }, {unique:true} )

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

http://docs.mongodb.org/manual/tutorial/create-a-compound-index/

http://docs.mongodb.org/manual/tutorial/create-a-unique-index/

Ответ 3

Он был обновлен из приведенных выше ответов.

используйте db.collection.updateOne() вместо db.collection.update(). а также db.collection.createIndexes() вместо db.collection.ensureIndex()

Обновление: методы update() и securityIndex() устарели из mongodb 2. *, вы можете увидеть более подробную информацию в mongo и путь ./mongodb/lib/collection.js. Для update() рекомендуемые методы updateOne, updateMany, or bulkWrite. Для ensureIndex() рекомендуемый метод createIndexes.