Vous pouvez le faire en spécifiant quelque chose pour correspondre au "document", puis l'entrée de tableau "shifts" requise comme expression de requête pour un .update()
. Appliquez ensuite le positionnel $
opérateur
pour l'index de tableau correspondant avec $pull
:
db.collection.update(
{ "_id": ObjectId("59180305c19dbaa4ecd9ee59"), "shifts.timeslot": "8:00 - NOON" },
{ "$pull": { "shifts.$.volunteers": { "fullname": "Mary Mack" } } }
)
Ce n'est pas grave dans ce cas puisque vous essayez uniquement de "faire correspondre" le tableau "externe" dans la structure imbriquée et le $pull
a ses propres arguments de requête pour identifier l'entrée de tableau à supprimer.
Vous devriez vraiment être prudent en utilisant des "tableaux imbriqués". Comme un $pull
une opération comme celle-ci fonctionne, les mises à jour du tableau "interne" ne sont pas vraiment possibles car le positionnel $
opérateur
ne correspondra qu'au "premier" élément qui remplit la condition. Ainsi, votre exemple de "Mary Mack" dans plusieurs équipes ne correspondra jamais qu'à la première entrée de tableau "shifts" trouvée.