sql >> Databáze >  >> NoSQL >> MongoDB

Jak odstranit prvek z dvojitě vnořeného pole v dokumentu MongoDB.

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:

  1. Změňte svou strukturu tak, abyste mohli využít $pull .
  2. Nepoužívejte $pull . Načtěte celý objekt do klienta a použijte findAndModify .


  1. Jaký je správný způsob indexování v MongoDB, když existuje velká kombinace polí

  2. Aktualizace vlastnosti vloženého dokumentu v Mongodb

  3. MongoDB:bezpodmínečné aktualizace?

  4. Jak analyzovat využití disku kontejneru Docker