MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann festgestellt werden, ob $addToSet tatsächlich ein neues Element zu einem MongoDB-Dokument hinzugefügt hat oder ob das Element bereits vorhanden ist?

Was Sie hier tun, ist natürlich die Überprüfung der Antwort, die angibt, ob ein Dokument aktualisiert oder eingefügt wurde oder ob tatsächlich keine Operation stattgefunden hat. Das ist Ihr bester Indikator für ein $addToSet ein Update durchgeführt zu haben, wäre das Dokument dann aktualisiert.

Die $addToSet Der Operator selbst kann keine Duplikate erzeugen, das liegt in der Natur des Operators. Aber Sie könnten tatsächlich einige Probleme mit Ihrer Logik haben:

{                                                
      "$addToSet", new BsonDocument()
           {
                { "items", new BsonDocument()
                     {
                          { "id", item.Id },
                          { "v", item.Value } 
                     }
                }
           }
 }

Sie zeigen also deutlich, dass ein Element in Ihrem "Set" aus zwei Feldern besteht. Wenn sich dieser Inhalt also in irgendeiner Weise unterscheidet (dh dieselbe ID, aber unterschiedlicher Wert), ist das Element tatsächlich ein "einzigartiges" Mitglied des Sets und wird es tun hinzugefügt werden. Es gäbe zum Beispiel keine Möglichkeit für $addToSet Operator, neue Werte nicht nur basierend auf der "id" als eindeutiger Kennung hinzuzufügen. Sie müssten das tatsächlich in Code rollen.

Eine zweite Möglichkeit hier für eine Art Duplikat ist, dass Ihr Abfrageteil das Dokument, das aktualisiert werden muss, nicht richtig findet. Das Ergebnis davon wäre die Erstellung eines neuen Dokuments, das nur das neu angegebene Mitglied in der "Menge" enthält. Ein häufiger Verwendungsfehler sieht also so aus:

db.collection.update(
    { 
        "id": ABC,
        "items": { "$elemMatch": {
            "id": 123, "v": 10
         }},
    {
        "$addToSet": {
            "items": {
                "id": 123, "v": 10
            }
        }
    },
    { "upsert": true }
)

Das Ergebnis einer solchen Operation würde immer ein neues Dokument erstellen, da das vorhandene Dokument das angegebene Element in der "Menge" nicht enthielt. Die korrekte Implementierung ist nicht Prüfen Sie, ob das "set"-Mitglied vorhanden ist, und erlauben Sie $addToSet um die Arbeit zu erledigen.

Wenn Sie tatsächlich wahr haben doppelte Einträge in dem "Satz" auftreten, in dem alle Elemente des untergeordneten Dokuments genau gleich sind, dann wurde dies durch einen anderen Code verursacht, entweder vorhanden oder in der Vergangenheit.

Wenn Sie sicher sind, dass neue Einträge erstellt werden, suchen Sie im Code nach Vorkommen von $push oder in der Tat und Array-Manipulation im Code, der auf dasselbe Feld zu wirken scheint.

Aber wenn Sie den Operator richtig verwenden, dann $addToSet macht genau das, wofür es gedacht ist.