MongoDB
 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
        }
}

लेकिन पहला परिणाम आपको अतिरिक्त पास की आवश्यकता के बिना वही आवश्यक डेटा देने जा रहा है।

किसी भी मामले में यह वास्तव में सिर्फ एक और $group है यह सब एक साथ लाने के लिए और फिर वैकल्पिक चरण यदि आपके पास वास्तव में वह डेटा प्रारूप होना चाहिए। लेकिन मैं व्यक्तिगत रूप से उस कोड में "जोड़ी" की किसी भी पहुंच को संभालूंगा जिसे इससे निपटने की आवश्यकता है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्या मोंगोडीबी को संग्रह नामों में बहुवचन रूप जोड़ने से रोकने का कोई तरीका है?

  2. मोंगोडब को गतिशील रूप से डीबीएस और संग्रह बनाना बंद करें

  3. मैं सिर्फ ObjectId के pymongo का उपयोग करने की सूची कैसे प्राप्त करूं?

  4. MongoDb क्वेरीज़ और system.linq

  5. नेवला में एम्बेडेड योजना दस्तावेज़ कैसे निकालें?