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