Du kan göra detta genom att ange något som matchar "dokumentet" och sedan den obligatoriska "shifts"-arrayposten som frågeuttrycket för en .update()
. Använd sedan positionella $
operatör
för det matchade arrayindexet med $pull
:
db.collection.update(
{ "_id": ObjectId("59180305c19dbaa4ecd9ee59"), "shifts.timeslot": "8:00 - NOON" },
{ "$pull": { "shifts.$.volunteers": { "fullname": "Mary Mack" } } }
)
Det är okej i det här fallet eftersom du bara försöker "matcha" på den "yttre" arrayen i den kapslade strukturen och $pull
har egna frågeargument för att identifiera arrayposten som ska tas bort.
Du bör verkligen vara försiktig med att använda "kapslade arrayer". Som medan en $pull
operation som denna fungerar, uppdateringar av den "inre" arrayen är inte riktigt möjliga eftersom positionell $
operatör
kommer bara att matcha det "första" elementet som uppfyller villkoret. Så ditt exempel på "Mary Mack" i flera skift skulle bara någonsin matcha i den första "skift"-arrayposten som hittades.