Heim > Backend-Entwicklung > PHP-Tutorial > 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
Freigeben: 2024-11-04 07:10:31
Original
1080 Leute haben es durchsucht

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})
Nach dem Login kopieren

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 }});
});
Nach dem Login kopieren
  • 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})
Nach dem Login kopieren

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 )
);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage