Zakochany,
Operator $pull nie będzie działał na dokumencie, którego używasz, ponieważ klucz "powiadomień" nie jest tak naprawdę tablicą. Jest to raczej osadzony dokument z ponumerowanymi kluczami, dzięki czemu powierzchownie przypomina tablicę. Nie ma sposobu (o którym wiem), aby zachować tę strukturę dokumentu i automatycznie zmienić nazwy ponumerowanych kluczy.
Jeśli nieznacznie zmienisz swój dokument, aby wyglądał tak:
{
"notifications": [
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "1lfw70h789u13a1e67pv"
},
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "iwoidjsoskqp23nlwof"
}
],
"toUname": "Eamorr"
}
Elementy nadal będą ponumerowane, niejawnie. Teraz jest to tablica, więc dostajesz to za darmo. Możesz użyć operatora $pull w ten sposób (nie znam sterownika PHP, więc podaję ci odpowiednik powłoki):
db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});
Do identyfikacji dokumentu użyłem arbitralnie klucza „toUname”, ale myślę, że będziesz chciał użyć pola _id. Ponadto używam klucza "id" wiadomości do identyfikacji wiadomości do pobrania z tablicy, ponieważ jest to o wiele bezpieczniejsze i zapewnia, że nie usuniesz przypadkowo niewłaściwej wiadomości na wypadek, gdyby tablica zmieniła się od tego czasu zidentyfikowałeś liczbę porządkową tablicy do usunięcia.
Mam nadzieję, że to pomoże.