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

So entfernen Sie ein Element aus einem doppelt verschachtelten Array in einem MongoDB-Dokument.

Um das betreffende Element zu löschen, verwenden Sie tatsächlich ein Update. Genauer gesagt werden Sie ein Update mit dem $pull durchführen Befehl, der das Element aus dem Array entfernt.

db.temp.update(
  { _id : "777" },
  {$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)

Hier passiert ein bisschen "Magie". Mit .0 gibt an, dass wir wissen, dass wir das 0. Element von someArray ändern . Mit {"name":"delete me"} gibt an, dass wir die genauen Daten kennen, die wir entfernen möchten.

Dieser Prozess funktioniert einwandfrei, wenn Sie die Daten in einen Client laden und dann das Update durchführen. Dieser Prozess funktioniert weniger gut, wenn Sie "allgemeine" Abfragen ausführen möchten, die diese Vorgänge ausführen.

Ich denke, es ist am einfachsten, einfach zu erkennen, dass das Aktualisieren von Arrays von Unterdokumenten im Allgemeinen erfordert, dass Sie das Original irgendwann im Speicher haben.

Als Antwort auf den ersten Kommentar unten können Sie Ihrer Situation wahrscheinlich helfen, indem Sie die Datenstruktur ein wenig ändern

"someObjects" : {
  "name1":  {
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
}

Jetzt können Sie {$pull : { "someObjects.name1.someNestedArray" : ... ausführen

Hier ist das Problem mit Ihrer Struktur. MongoDB bietet keine sehr gute Unterstützung für die Manipulation von "Sub-Arrays". Ihre Struktur hat ein Array von Objekten und diese Objekte enthalten Arrays von weiteren Objekten.

Wenn Sie die folgende Struktur haben, werden Sie Schwierigkeiten haben, Dinge wie $pull zu verwenden :

array [
  { subarray : array [] },
  { subarray : array [] },
]

Wenn Ihre Struktur so aussieht und Sie möchten subarray aktualisieren Sie haben zwei Möglichkeiten:

  1. Ändern Sie Ihre Struktur so, dass Sie $pull nutzen können .
  2. Verwenden Sie $pull nicht . Laden Sie das gesamte Objekt in einen Client und verwenden Sie findAndModify .