Emorr,
L'opérateur $pull ne fonctionnera pas sur le document que vous utilisez, car la clé "notifications" n'est pas vraiment un tableau. Il s'agit plutôt d'un document intégré, avec des clés numérotées, ce qui le fait ressembler superficiellement à un tableau. Il n'y a aucun moyen (à ma connaissance) de conserver cette structure de document et de renommer automatiquement les clés numérotées.
Si vous refactorisez légèrement votre document, pour qu'il ressemble à ceci :
{
"notifications": [
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "1lfw70h789u13a1e67pv"
},
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "iwoidjsoskqp23nlwof"
}
],
"toUname": "Eamorr"
}
Les éléments seront toujours numérotés, implicitement. C'est maintenant un tableau, donc vous l'obtenez gratuitement. Vous pouvez utiliser l'opérateur $pull comme celui-ci (je ne connais pas le pilote PHP, donc je vous donne l'équivalent du shell) :
db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});
J'ai arbitrairement utilisé la clé "toUname" pour identifier le document, mais je suppose que vous voudrez utiliser le champ _id. De plus, j'utilise la clé "id" des messages pour identifier le message à extraire du tableau, car il est beaucoup plus sûr et garantit que vous ne supprimez pas accidentellement le mauvais message au cas où le tableau aurait changé depuis vous avez identifié l'ordinal de tableau à supprimer.
J'espère que cela aide.