Bạn có thể thực hiện việc này bằng cách chỉ định một cái gì đó để khớp với "tài liệu" và sau đó là mục nhập mảng "dịch chuyển" bắt buộc làm biểu thức truy vấn cho .update()
. Sau đó, áp dụng vị trí $
nhà điều hành
cho chỉ mục mảng phù hợp với $pull
:
db.collection.update(
{ "_id": ObjectId("59180305c19dbaa4ecd9ee59"), "shifts.timeslot": "8:00 - NOON" },
{ "$pull": { "shifts.$.volunteers": { "fullname": "Mary Mack" } } }
)
Điều đó không sao trong trường hợp này vì bạn chỉ đang cố gắng "khớp" trên mảng "bên ngoài" trong cấu trúc lồng nhau và $pull
có các đối số truy vấn của riêng nó để xác định mục nhập mảng cần loại bỏ.
Tuy nhiên, bạn thực sự nên cẩn thận khi sử dụng "các mảng lồng nhau". Trong khi $pull
hoạt động như thế này hoạt động, cập nhật cho mảng "bên trong" không thực sự khả thi vì vị trí $
nhà điều hành
sẽ chỉ khớp với phần tử "đầu tiên" đáp ứng điều kiện. Vì vậy, ví dụ của bạn về "Mary Mack" trong nhiều ca sẽ chỉ khớp trong mục nhập mảng "ca" đầu tiên được tìm thấy.