web-dev-qa-db-fra.com

Comment arrêter l'insertion de documents en double dans une collection mongodb

Ayons une collection MongoDB qui a trois documents ..

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' }

Nous avons un doc,

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

Si nous utilisons

 db.collection.insert(doc) 

ici, ce document en double sera inséré dans la base de données.

 { _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' }

Comment ce doublon peut être arrêté. Dans quel domaine l'indexation doit-elle être effectuée ou toute autre approche?

37
shashank

N'utilisez pas d'insert.

Utilisez mise à jour avec upsert=true . La mise à jour recherchera le document qui correspond à votre requête, puis elle modifiera les champs que vous souhaitez et ensuite, vous pouvez lui dire upsert: Vrai si vous souhaitez insérer si aucun document ne correspond à votre requête.

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

Donc, pour votre exemple, vous pouvez utiliser quelque chose comme ceci:

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

Vous devez utiliser un index composé sur l'ensemble des champs qui identifient de manière unique un document dans votre collection MongoDB. Par exemple, si vous décidez que la combinaison de l'utilisateur, du titre et de la banque est votre clé unique, vous émettez la commande suivante:

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

Veuillez noter que cela doit être fait après avoir supprimé les doublons précédemment stockés.

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

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

28
John Petrone

Il a été mis à jour à partir des réponses ci-dessus.

veuillez utiliser db.collection.updateOne() au lieu de db.collection.update(). et aussi db.collection.createIndexes() au lieu de db.collection.ensureIndex()

Mise à jour: les méthodes update () et assureIndex () a été dépréciée de mongodb 2. *, vous pouvez voir plus de détails dans mongo et le chemin est ./mongodb/lib/collection.js. Pour update(), les méthodes recommandées sont updateOne, updateMany, or bulkWrite. Pour ensureIndex(), la méthode recommandée est createIndexes.

5
Creem