Eamorr、
「notifications」キーは実際には配列ではないため、$pull演算子は使用しているドキュメントでは機能しません。これは、番号付きのキーが付いた埋め込みドキュメントであり、表面的には配列に似ています。このドキュメント構造を維持し、番号付きのキーの名前を自動的に変更する方法はありません。
ドキュメントを少しリファクタリングすると、次のようになります。
{
"notifications": [
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "1lfw70h789u13a1e67pv"
},
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "iwoidjsoskqp23nlwof"
}
],
"toUname": "Eamorr"
}
要素には、暗黙的に番号が付けられます。これで配列になったので、無料で入手できます。次のように$ pull演算子を使用できます(私はPHPドライバーに精通していないため、同等のシェルを提供します):
db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});
ドキュメントを識別するために「toUname」キーを任意に使用しましたが、_id-fieldを使用することをお勧めします。また、メッセージの「id」キーを使用して、配列からプルするメッセージを識別しています。これは、はるかに安全であり、配列が変更された場合に誤って間違ったメッセージを削除しないようにするためです。削除する配列の序数を特定しました。
お役に立てば幸いです。