Eamorr,
Der $pull-Operator funktioniert bei dem von Ihnen verwendeten Dokument nicht, da der "Notifications"-Schlüssel nicht wirklich ein Array ist. Es ist eher ein eingebettetes Dokument mit nummerierten Schlüsseln, wodurch es oberflächlich einem Array ähnelt. Es gibt (soweit ich weiß) keine Möglichkeit, diese Dokumentstruktur beizubehalten und die nummerierten Schlüssel automatisch umbenennen zu lassen.
Wenn Sie Ihr Dokument leicht umgestalten, sieht es so aus:
{
"notifications": [
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "1lfw70h789u13a1e67pv"
},
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "iwoidjsoskqp23nlwof"
}
],
"toUname": "Eamorr"
}
Die Elemente werden weiterhin implizit nummeriert. Es ist jetzt ein Array, also bekommen Sie das kostenlos. Sie können den $pull-Operator wie folgt verwenden (ich bin mit dem PHP-Treiber nicht vertraut, also gebe ich Ihnen das Shell-Äquivalent):
db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});
Ich habe willkürlich den "toUname"-Schlüssel verwendet, um das Dokument zu identifizieren, aber ich denke, Sie werden das _id-Feld verwenden wollen. Außerdem verwende ich den "id"-Schlüssel der Nachrichten, um die Nachricht zu identifizieren, die aus dem Array gezogen werden soll, da dies viel sicherer ist und sicherstellt, dass Sie nicht versehentlich die falsche Nachricht entfernen, falls sich das Array seitdem geändert hat Sie haben die zu entfernende Ordnungszahl des Arrays identifiziert.
Ich hoffe, das hilft.