Chcete-li odstranit dotyčnou položku, ve skutečnosti použijete aktualizaci. Konkrétněji provedete aktualizaci pomocí $pull
příkaz, který odstraní položku z pole.
db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)
Tady se děje trochu "kouzla". Pomocí .0
označuje, že víme, že upravujeme 0. položku someArray
. Pomocí {"name":"delete me"}
znamená, že známe přesná data, která plánujeme odstranit.
Tento proces funguje dobře, pokud načtete data do klienta a poté provedete aktualizaci. Tento proces funguje méně dobře, pokud chcete provádět „obecné“ dotazy, které provádějí tyto operace.
Myslím, že je nejjednodušší jednoduše uznat, že aktualizace polí dílčích dokumentů obecně vyžaduje, abyste měli originál v určitém okamžiku v paměti.
V reakci na první komentář níže si pravděpodobně můžete pomoci své situaci tím, že trochu změníte datovou strukturu
"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}
Nyní můžete provést {$pull : { "someObjects.name1.someNestedArray" : ...
Zde je problém s vaší strukturou. MongoDB nemá příliš dobrou podporu pro manipulaci s "podpolemi". Vaše struktura má pole objektů a tyto objekty obsahují pole více objektů.
Pokud máte následující strukturu, budete mít potíže s používáním věcí jako $pull
:
array [
{ subarray : array [] },
{ subarray : array [] },
]
Pokud vaše struktura vypadá takto a chcete aktualizovat subarray
máte dvě možnosti:
- Změňte svou strukturu tak, abyste mohli využít
$pull
. - Nepoužívejte
$pull
. Načtěte celý objekt do klienta a použijtefindAndModify
.