Как остановить вставку дубликатов документов в коллекцию 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' }
Как этот дубликат можно остановить. В каком поле должно выполняться индексирование или какой-либо другой подход?
Ответы
Ответ 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
.