आपको एकत्रीकरण ढांचे का उपयोग करने की आवश्यकता होगी जहां आप एक एकत्रीकरण पाइपलाइन चलाएंगे जो पहले संग्रह में दस्तावेज़ों को स्थान सूची
के आधार पर फ़िल्टर करती है $match<का उपयोग करने वाले आईडी /कोड>
ऑपरेटर।
दूसरी पाइपलाइन में स्थान सूची
. को समतल करना होगा और योग
दस्तावेजों में डेटा के लिए उप-दस्तावेज़ सरणियों को पाइपलाइन के नीचे डीनॉर्मलाइज़्ड प्रविष्टियों के रूप में संसाधित किया जाना है। $unwind
ऑपरेटर यहां उपयोगी है।
$match का उपयोग करके एक और फ़िल्टर
खोलने के बाद आवश्यक है ताकि अगली पाइपलाइन में केवल उन दस्तावेज़ों की अनुमति दी जाए जिन्हें आप एकत्र करना चाहते हैं।
मुख्य पाइपलाइन होगी $समूह
संचायक ऑपरेटर $sum
. वांछित परिणाम के लिए, आपको $cond
स्वतंत्र गणना फ़ील्ड बनाने के लिए क्योंकि यह $sum
नाम मान के आधार पर अभिव्यक्ति।
इसे पूरी तरह से रखते हुए, निम्न पाइपलाइन चलाने पर विचार करें:
db.collection.aggregate([
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList" },
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList.sum" },
{
"$group": {
"_id": null,
"linux": {
"$sum": {
"$cond": [
{ "$eq": [ "$venueList.sum.name", "linux" ] },
"$venueList.sum.value", 0
]
}
},
"ubuntu": {
"$sum": {
"$cond": [
{ "$eq": [ "$venueList.sum.name", "ubuntu" ] },
"$venueList.sum.value", 0
]
}
}
}
}
])
mGo के साथ उपयोग के लिए, आप http में दिए गए मार्गदर्शन का उपयोग करके उपरोक्त पाइपलाइन को रूपांतरित कर सकते हैं://godoc.org/labix.org/v2/mgo#Collection.Pipe
अधिक लचीले और बेहतर प्रदर्शन करने वाले विकल्प के लिए जो उपरोक्त की तुलना में बहुत तेजी से निष्पादित होता है, और योग सूची के लिए अज्ञात मानों को भी ध्यान में रखता है, वैकल्पिक पाइपलाइन को निम्नानुसार चलाएं
db.collection.aggregate([
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList" },
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList.sum" },
{
"$group": {
"_id": "$venueList.sum.name",
"count": { "$sum": "$venueList.sum.value" }
}
},
{
"$group": {
"_id": null,
"counts": {
"$push": {
"name": "$_id",
"count": "$count"
}
}
}
}
])