Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erhalte ich doppelte Dokumente in meiner MongoDB-Sammlung, selbst nachdem ich mit „dropDups“ einen eindeutigen Schlüssel erstellt habe?

Warum erhalte ich doppelte Dokumente in meiner MongoDB-Sammlung, selbst nachdem ich mit „dropDups“ einen eindeutigen Schlüssel erstellt habe?

DDD
DDDOriginal
2024-11-04 07:10:311009Durchsuche

Why Am I Getting Duplicate Documents in My MongoDB Collection Even After Creating a Unique Key with `dropDups`?

MongoDB-Duplikatdokumente nach dem Hinzufügen eines eindeutigen Schlüssels

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

  • Doppelte Dokumente entfernen : Um dieses Problem zu beheben, entfernen Sie die doppelten Dokumente, bevor Sie den eindeutigen Index erstellen. Dies kann durch Aggregations- und Entfernungsabfragen erreicht werden.
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 }});
});
  • Erstellen Sie den eindeutigen Index: Nachdem Sie die Duplikate entfernt haben, erstellen Sie den eindeutigen Index wie vorgesehen.
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn