Můžete to udělat tak, že jako výraz dotazu pro .update()
zadáte něco, co se bude shodovat s „dokumentem“ a poté s požadovanou položkou pole „shifts“. . Poté použijte poziční $
operátor
pro odpovídající index pole pomocí $pull
:
db.collection.update(
{ "_id": ObjectId("59180305c19dbaa4ecd9ee59"), "shifts.timeslot": "8:00 - NOON" },
{ "$pull": { "shifts.$.volunteers": { "fullname": "Mary Mack" } } }
)
To je v tomto případě v pořádku, protože se pouze pokoušíte "shodovat" na "vnějším" poli ve vnořené struktuře a $pull
má vlastní argumenty dotazu k identifikaci položky pole, kterou chcete odstranit.
Opravdu byste však měli být opatrní při používání „vnořených polí“. Stejně jako $pull
operace takto funguje, aktualizace "vnitřního" pole nejsou ve skutečnosti možné, protože poziční $
operátor
bude odpovídat pouze "prvnímu" prvku, který splňuje podmínku. Takže váš příklad "Mary Mack" ve více směnách by se vždy shodoval pouze v prvním nalezeném záznamu pole "shifts".