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:
- Ändern Sie Ihre Struktur so, dass Sie
$pull
nutzen können . - Verwenden Sie
$pull
nicht . Laden Sie das gesamte Objekt in einen Client und verwenden SiefindAndModify
.