Eamorr,
Операторът $pull няма да работи с документа, който използвате, защото ключът "notifications" всъщност не е масив. Това е по-скоро вграден документ с номерирани клавиши, което го прави външно наподобяващ масив. Няма начин (за който знам) да запазите тази структура на документа и номерираните клавиши да се преименуват автоматично.
Ако преработите леко документа си, за да изглежда така:
{
"notifications": [
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "1lfw70h789u13a1e67pv"
},
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "iwoidjsoskqp23nlwof"
}
],
"toUname": "Eamorr"
}
Елементите все още ще бъдат номерирани имплицитно. Вече е масив, така че го получавате безплатно. Можете да използвате оператора $pull по този начин (не съм запознат с PHP-драйвера, така че ви давам еквивалента на shell):
db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});
Произволно използвах ключа "toUname", за да идентифицирам документа, но предполагам, че ще искате да използвате полето _id. Освен това използвам ключа „id“ на съобщенията, за да идентифицирам съобщението, което да изтегля от масива, тъй като е много по-безопасно и гарантира, че случайно няма да премахнете грешното съобщение, в случай че масивът се е променил оттогава идентифицирахте порядъка на масива за премахване.
Надявам се, че това помага.