問題のアイテムを削除するには、実際にアップデートを使用します。具体的には、$pull
を使用して更新を行います。 配列からアイテムを削除するコマンド。
db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)
ここで少し「魔法」が起こっています。 .0
を使用する someArray
の0番目の項目を変更していることがわかっていることを示します 。 {"name":"delete me"}
を使用する 削除する予定の正確なデータがわかっていることを示します。
このプロセスは、データをクライアントにロードしてから更新を実行する場合に問題なく機能します。これらの操作を実行する「一般的な」クエリを実行する場合、このプロセスはあまりうまく機能しません。
サブドキュメントの配列を更新するには、通常、ある時点でオリジナルをメモリに保存する必要があることを簡単に認識するのが最も簡単だと思います。
以下の最初のコメントに応えて、データ構造を少し変更することで状況を改善できる可能性があります
"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}
これで、{$pull : { "someObjects.name1.someNestedArray" : ...
を実行できます。
これがあなたの構造の問題です。 MongoDBは、「サブ配列」の操作をあまりサポートしていません。構造にはオブジェクトの配列があり、それらのオブジェクトにはさらに多くのオブジェクトの配列が含まれています。
次のような構造の場合、$pull
のようなものを使用するのは困難になります。 :
array [
{ subarray : array [] },
{ subarray : array [] },
]
構造がそのように見える場合および subarray
を更新したい 2つのオプションがあります:
-
$pull
を活用できるように構造を変更します 。 -
$pull
は使用しないでください 。オブジェクト全体をクライアントにロードし、findAndModify
を使用します 。