Sie können dies tun, indem Sie etwas angeben, das mit dem „Dokument“ übereinstimmt, und dann den erforderlichen „Shifts“-Array-Eintrag als Abfrageausdruck für ein .update()
angeben . Wenden Sie dann den positionsbezogenen $
an Betreiber
für den übereinstimmenden Array-Index mit $pull
:
db.collection.update(
{ "_id": ObjectId("59180305c19dbaa4ecd9ee59"), "shifts.timeslot": "8:00 - NOON" },
{ "$pull": { "shifts.$.volunteers": { "fullname": "Mary Mack" } } }
)
Das ist in diesem Fall in Ordnung, da Sie nur versuchen, das "äußere" Array in der verschachtelten Struktur und dem $pull
hat eigene Abfrageargumente, um den zu entfernenden Array-Eintrag zu identifizieren.
Sie sollten jedoch wirklich vorsichtig sein, wenn Sie "verschachtelte Arrays" verwenden. Als während ein $pull
Vorgang wie dieser funktioniert, Aktualisierungen des "inneren" Arrays sind nicht wirklich möglich, da der positional $
Betreiber
stimmt nur mit dem "ersten" Element überein, das die Bedingung erfüllt. Ihr Beispiel von „Mary Mack“ in mehreren Schichten würde also immer nur mit dem ersten gefundenen „Schichten“-Array-Eintrag übereinstimmen.