it-swarm.com.de

So stoppen Sie das Einfügen doppelter Dokumente in eine Mongodb-Sammlung

Lassen Sie uns eine MongoDB -Auflistung haben, die drei Dokumente enthält.

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

Wir haben einen Doc,

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

Wenn wir verwenden

 db.collection.insert(doc) 

hier wird dieses doppelte Dokument in die Datenbank eingefügt.

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

Wie dieses Duplikat gestoppt werden kann. Auf welchem ​​Gebiet sollte die Indizierung erfolgen oder auf andere Weise?

37
shashank

Verwenden Sie keine Einfügung.

Verwenden Sie pdate mit upsert=true . Update sucht nach dem Dokument, das Ihrer Abfrage entspricht, und ändert dann die gewünschten Felder. Anschließend können Sie feststellen, dass es falsch ist: True, wenn Sie einfügen möchten, dass kein Dokument Ihrer Abfrage entspricht.

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

Für Ihr Beispiel könnten Sie also Folgendes verwenden:

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

Sie sollten einen zusammengesetzten Index für die Gruppe von Feldern verwenden, die ein Dokument in Ihrer MongoDB-Sammlung eindeutig identifizieren. Wenn Sie beispielsweise festlegen, dass die Kombination aus Benutzer, Titel und Bank Ihr eindeutiger Schlüssel ist, geben Sie den folgenden Befehl ein:

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

Bitte beachten Sie, dass dies erfolgen sollte, nachdem Sie zuvor gespeicherte Duplikate entfernt haben.

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

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

28
John Petrone

Es wurde aus den obigen Antworten aktualisiert.

bitte verwenden Sie db.collection.updateOne() anstelle von db.collection.update(). und auch db.collection.createIndexes() anstelle von db.collection.ensureIndex()

Update: Die Methoden update () und sureIndex () wurden von Mongodb 2 verworfen. * Weitere Details finden Sie in Mongo und der Pfad ist ./mongodb/lib/collection.js. Für update() sind die empfohlenen Methoden updateOne, updateMany, or bulkWrite. Für ensureIndex() lautet die empfohlene Methode createIndexes.

5
Creem