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

MongoDB-複数の行を集約

    $groupを実行する必要があるため、クエリですべての正しいことをすでに実行しています。 正しい合計を得るためにあなたが持っているレベルで。残っているのは、すべてをまとめることだけです。

    個人的には、最終出力として配列内の「ペア」を使用します。

    Machine.aggregate([ 
        { "$match": { 
            "idc": req.query.idc, "customer": req.query.customer}
        } ,
        { "$group": { 
            "_id": {
                "cluster": "$cluster",
                "idc":"$idc",
                "type": "$type"
            },
            "SumCores": { "$sum":"$cores" },
            "SumMemory": { "$sum":"$memory" }
        }},
        { "$group": {
            "_id": {
                "cluster": "$_id.cluster",
                "idc": "$_id.idc"
            },
            "data": {
                "$push": {
                    "type": "$_id.type",
                    "SumCores": "$SumCores",
                    "SumMemory": "$SumMemory"
                }
            }
        }},
        { "$sort" : { "_id.idc": -1, "_id.cluster": 1 } }
    ]);
    

    それはあなたに与えるでしょう:

    {
            "_id" : {
                    "cluster" : 1,
                    "idc" : "LH8"
            },
            "data" : [
                    {
                            "type" : "Virtual",
                            "SumCores" : 232,
                            "SumMemory" : 469
                    },
                    {
                            "type" : "Physical",
                            "SumCores" : 256,
                            "SumMemory" : 1024
                    }
            ]
    }
    {
            "_id" : {
                    "cluster" : 1,
                    "idc" : "LH5"
            },
            "data" : [
                    {
                            "type" : "Virtual",
                            "SumCores" : 112,
                            "SumMemory" : 384
                    },
                    {
                            "type" : "Physical",
                            "SumCores" : 192,
                            "SumMemory" : 768
                    }
            ]
    }
    

    ただし、本当に必要な場合は、配列から一致した要素を除外して、それらを独自のプロパティに配置できます。

    Machine.aggregate([ 
        { "$match": { 
            "idc": req.query.idc, "customer": req.query.customer}
        } ,
        { "$group": { 
            "_id": {
                "cluster": "$cluster",
                "idc":"$idc",
                "type": "$type"
            },
            "SumCores": { "$sum":"$cores" },
            "SumMemory": { "$sum":"$memory" }
        }},
        { "$group": {
            "_id": {
                "cluster": "$_id.cluster",
                "idc": "$_id.idc"
            },
            "data": {
                "$push": {
                    "type": "$_id.type",
                    "SumCores": "$SumCores",
                    "SumMemory": "$SumMemory"
                }
            }
        }},
        { "$project": {
            "Physical": {
                "$setDifference": [
                    { "$map": {
                        "input": "$data",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { "$eq": [ "$$el.type", "Physical" ] },
                                {
                                    "SumCores": "$$el.SumCores",
                                    "SumMemory": "$$el.SumMemory"
                                },
                                false
                            ]
                        }
                    }},
                    [false]
                ]
            },
            "Virtual": {
                "$setDifference": [
                    { "$map": {
                        "input": "$data",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { "$eq": [ "$$el.type", "Virtual" ] },
                                {
                                    "SumCores": "$$el.SumCores",
                                    "SumMemory": "$$el.SumMemory"
                                },
                                false
                            ]
                        }
                    }},
                    [false]
                ]
            }
        }},
        { "$unwind": "$Physical" },
        { "$unwind": "$Virtual"},
        { "$sort" : { "_id.idc": -1, "_id.cluster": 1 } }
    ]);
    

    結果が得られます:

    {
            "_id" : {
                    "cluster" : 1,
                    "idc" : "LH8"
            },
            "Physical" : {
                    "SumCores" : 256,
                    "SumMemory" : 1024
            },
            "Virtual" : {
                    "SumCores" : 232,
                    "SumMemory" : 469
            }
    }
    {
            "_id" : {
                    "cluster" : 1,
                    "idc" : "LH5"
            },
            "Physical" : {
                    "SumCores" : 192,
                    "SumMemory" : 768
            },
            "Virtual" : {
                    "SumCores" : 112,
                    "SumMemory" : 384
            }
    }
    

    ただし、1つ目は、結果を追加で通過することなく、同じ重要なデータを提供するだけです。

    とにかく、それは本当にもう1つの$group それをすべてまとめてから、本当にそのデータ形式が必要な場合はオプションのステージを作成します。しかし、私はそれを処理する必要があるコード内の「ペア」へのアクセスを個人的に処理します。




    1. Mongoで非推奨のフィールドを削除するにはどうすればよいですか?

    2. MongoDB:MongoDBシェルでコレクションのすべてのレコードを削除する方法は?

    3. PythonとRedis:マネージャー/ワーカーアプリケーションのベストプラクティス

    4. Nodejs / Express-アプリの起動:express.createServer()は非推奨です