Problembeschreibung
Trotz der Erstellung einer Sammlung mit einem eindeutigen Schlüssel auf der Seite „ In den Feldern „uid“ und „sid“ werden immer noch doppelte Dokumente in die Sammlung eingefügt.
Technische Details
Der verwendete Indexerstellungsbefehl:
db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
Ursache
Die Indexerstellung schlägt aufgrund des Vorhandenseins doppelter Dokumente in der Sammlung fehl. In MongoDB Version 3.0.0 funktioniert die Option „dropDups“ nicht ordnungsgemäß, was zu diesem Problem führt.
Lösung
db.events.aggregate([ { "$group": { "_id": { "uid": "$uid", "sid": "$sid" }, "dups": { "$push": "$_id" }, "count": { "$sum": 1 } }}, { "$match": { "count": { "$gt": 1 } }} ]).forEach(function(doc) { doc.dups.shift(); db.events.remove({ "_id": {"$in": doc.dups }}); });
db.events.createIndex({"uid":1 , "sid": 1},{unique:true})
Upsert-Vorgang
Für den zweiten Teil der Frage, um das gewünschte Verhalten beim Einfügen oder Aktualisieren eines Dokuments basierend auf dem Vorhandensein vorhandener Daten zu erreichen , verwenden Sie die Methode „.update()“ mit der Option „upsert“:
$collection->update( array( "uid" => 1, "sid" => 1 ), array( '$set' => $someData ), array( 'upsert' => true ) );
Dadurch werden gefundene Dokumente geändert und bei Bedarf neue Dokumente eingefügt. Darüber hinaus können Sie mit „$setOnInsert“ Felder angeben, die nur beim Einfügen des Dokuments gesetzt werden sollen.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich doppelte Dokumente in meiner MongoDB-Sammlung, selbst nachdem ich mit „dropDups' einen eindeutigen Schlüssel erstellt habe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!