Amore,
L'operatore $pull non funzionerà sul documento che stai utilizzando, perché la chiave "notifiche" non è in realtà un array. È piuttosto un documento incorporato, con chiavi numerate, che lo rendono superficialmente simile a un array. Non c'è modo (che io sappia) per mantenere questa struttura del documento e far rinominare automaticamente le chiavi numerate.
Se refactoring leggermente il tuo documento, per assomigliare a questo:
{
"notifications": [
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "1lfw70h789u13a1e67pv"
},
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "iwoidjsoskqp23nlwof"
}
],
"toUname": "Eamorr"
}
Gli elementi saranno ancora numerati, implicitamente. Ora è un array, quindi lo ottieni gratuitamente. Puoi usare l'operatore $pull in questo modo (non ho familiarità con il driver PHP, quindi ti sto dando l'equivalente della shell):
db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});
Ho usato arbitrariamente la chiave "toUname" per identificare il documento, ma suppongo che vorrai usare il campo _id. Inoltre, sto usando la chiave "id" dei messaggi per identificare il messaggio da estrarre dall'array, poiché è molto più sicuro e si assicura di non rimuovere accidentalmente il messaggio sbagliato nel caso in cui l'array sia cambiato da allora hai identificato l'ordinale dell'array da rimuovere.
Spero di esserti stato d'aiuto.