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

動的キーをクエリする方法-mongodbスキーマ設計

    MongoDB 3.4.4以降のバージョンの使用:

    db.coll.aggregate([
        { "$replaceRoot": {
            "newRoot": {
                "$arrayToObject": {
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": {
                            "$eq": [
                                "$$el.v.samekeyA",
                                "value1"
                            ]
                        }
                    }
                }
            }   
        } }
    ])
    

    上記のパイプラインは最終出力を生成します

    {
        "key1" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
    

    説明

    パイプラインを分解して、個々のオペレーターの結果を表示できます。

    $ objectToArray

    $ objectToArray 動的キー(システム変数 $$ ROOT )元のドキュメントの各フィールド/値のペアの要素を含む配列に変換します。戻り配列の各要素は、2つのフィールドkとvを含むドキュメントです。 $ project ステージ

    db.coll.aggregate([
        { "$project": {
            "keys": { "$objectToArray": "$$ROOT" }
        } }
    ])
    

    収量

    {
        "_id" : 1,
        "keys" : [ 
            {
                "k" : "_id",
                "v" : 1
            }, 
            {
                "k" : "key1",
                "v" : {
                    "samekeyA" : "value1",
                    "samekeyB" : "value2"
                }
            }, 
            {
                "k" : "key2",
                "v" : {
                    "samekeyA" : "value3",
                    "samekeyB" : "value4"
                }
            }, 
            {
                "k" : "key3",
                "v" : {
                    "samekeyA" : "value5",
                    "samekeyB" : "value6"
                }
            }
        ]
    }
    

    $ filter

    $ filter 演算子は、 <によって生成された配列のフィルタリングメカニズムとして機能します。 code> $ objectToArray 演算子は、クエリになる指定された条件に基づいて返す配列のサブセットを選択することによって機能します。

    条件{"samekeyA": "value1"}に一致するキー/値ペアの配列を返す次のパイプラインについて考えてみます。

    db.coll.aggregate([
        { "$project": {
            "keys": { 
                "$filter": {
                    "input": { "$objectToArray": "$$ROOT" },
                    "as": "el",
                    "cond": {
                        "$eq": [
                            "$$el.v.samekeyA",
                            "value1"
                        ]
                    }
                }  
            }
        } }
    ])
    

    これにより

    {
        "_id" : 1,
        "keys" : [ 
            {
                "k" : "key1",
                "v" : {
                    "samekeyA" : "value1",
                    "samekeyB" : "value2"
                }
            }
        ]
    }
    

    $ arrayToObject

    これにより、上記のフィルター処理された配列が

    から変換されます。
    [ 
        {
            "k" : "key1",
            "v" : {
                "samekeyA" : "value1",
                "samekeyB" : "value2"
            }
        }
    ]
    

    動的キーを使用して元のドキュメントに

    {
        "key1" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
    

    パイプラインを実行する

    db.coll.aggregate([
        { "$project": {
            "key": {
                "$arrayToObject": {
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": {
                            "$eq": [
                                "$$el.v.samekeyA",
                                "value1"
                            ]
                        }
                    }
                }
            }   
        } }
    ])
    

    生成します

    {
        "_id" : 1,
        "key" : {
            "key1" : {
                "samekeyA" : "value1",
                "samekeyB" : "value2"
            }
        }
    }
    

    $ replaceRoot

    これにより、フィルタリングされた動的キードキュメントがトップレベルに昇格し、他のすべてのフィールドが置き換えられます。この操作により、 _id を含む、入力ドキュメント内の既存のすべてのフィールドが置き換えられます。 分野。

    基本的に、これは上記のドキュメントを変換します

    {
        "_id" : 1,
        "key" : {
            "key1" : {
                "samekeyA" : "value1",
                "samekeyB" : "value2"
            }
        }
    }
    

    目的の最終出力に

    {
        "key1" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
    


    1. Redisキャッシュ内のデータの階層(ツリー)の一部を無効にする方法

    2. mongodbクエリを動的に構築する方法

    3. 自動フェイルオーバーを備えたRedisと同様に、Azureの外部でローカルのWindowsベースのサービスバスを作成するにはどうすればよいですか?

    4. RedisserviceStackプール接続クライアント