Eamorr,
Toán tử $ pull sẽ không hoạt động trên tài liệu bạn đang sử dụng, vì khóa "thông báo" không thực sự là một mảng. Nó đúng hơn là một tài liệu nhúng, với các khóa được đánh số, làm cho nó trông giống một mảng. Không có cách nào (mà tôi biết) để giữ cấu trúc tài liệu này và tự động đổi tên các khóa được đánh số.
Nếu bạn cấu trúc lại tài liệu của mình một chút, để trông giống như sau:
{
"notifications": [
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "1lfw70h789u13a1e67pv"
},
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "iwoidjsoskqp23nlwof"
}
],
"toUname": "Eamorr"
}
Các phần tử sẽ vẫn được đánh số một cách ngầm định. Bây giờ nó là một mảng, vì vậy bạn có thể nhận miễn phí. Bạn có thể sử dụng toán tử $ pull như thế này (tôi không quen với trình điều khiển PHP, vì vậy tôi cung cấp cho bạn trình điều khiển tương đương):
db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});
Tôi đã tự ý sử dụng khóa "toUname" để xác định tài liệu, nhưng tôi đoán bạn sẽ muốn sử dụng trường _id. Ngoài ra, tôi đang sử dụng khóa "id" của thư để xác định thư cần lấy từ mảng, vì nó an toàn hơn rất nhiều và đảm bảo bạn không vô tình xóa nhầm thư trong trường hợp mảng đã thay đổi. bạn đã xác định thứ tự mảng cần loại bỏ.
Tôi hy vọng điều đó sẽ hữu ích.