sql >> データベース >  >> NoSQL >> MongoDB

MongoDBドキュメントの二重にネストされた配列から要素を削除する方法。

    問題のアイテムを削除するには、実際にアップデートを使用します。具体的には、$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つのオプションがあります:

    1. $pullを活用できるように構造を変更します 。
    2. $pullは使用しないでください 。オブジェクト全体をクライアントにロードし、findAndModifyを使用します 。


    1. 常に埋め込まれたEmberデータのマルチレベル階層

    2. MongoDBハッシュインデックスの場合

    3. SpringデータキャッシュでRedisを使用するときに分散/クラスター化キャッシュを有効にする方法

    4. DockerComposeを使用してMongoDBとRedpandaのアプリケーションを開発する方法