एकत्रीकरण ढांचे के साथ, परिणाम आपके "वांछित" आउटपुट से थोड़ा अलग होगा क्योंकि हैश कुंजी होने के बजाय, आपको _id
के साथ ऑब्जेक्ट्स की एक सरणी मिलती है। कुंजी का एक मान है जो आपको फ़ील्ड द्वारा समूह का प्रतिनिधित्व करता है। उदाहरण के लिए, के बजाय
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
आपके पास एक बेहतर संरचना होगी जैसे
[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
उपरोक्त परिणाम को पूरा करने के लिए <का उपयोग करने की आवश्यकता होगी। कोड>$cond
ऑपरेटर में $sum
संचायक ऑपरेटर। $cond
ऑपरेटर अपने पहले तर्क (यदि) के आधार पर तार्किक स्थिति का मूल्यांकन करेगा और फिर दूसरा तर्क देता है जहां मूल्यांकन सत्य है (तब) या तीसरा तर्क जहां झूठा (अन्य)। यह सही/गलत तर्क को 1 और 0 संख्यात्मक मानों में बदल देता है जो $sum
क्रमशः:
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
परिणामस्वरूप पाइपलाइन के रूप में, किसी को एग्रीगेशन ऑपरेशन चलाने की आवश्यकता होती है जो $dateToString
_id
. में ऑपरेटर के लिए मुख्य एक्सप्रेशन $समूह
पाइपलाइन:
Orders.aggregate([
{
"$group": {
"_id": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$created_at"
}
},
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
},
"failure_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "failure" ] }, 1, 0 ]
}
}
}
}
], function (err, orders){
if (err) throw err;
console.log(orders);
})
हालांकि, एक अधिक लचीला और बेहतर प्रदर्शन करने वाला दृष्टिकोण है जो ऊपर की तुलना में बहुत तेजी से निष्पादित होता है, जहां आपके एकत्रीकरण परिणाम के लिए सबसे कुशल डेटा संरचना उदाहरण के लिए स्कीमा का अनुसरण करती है:
orders = [
{
"_id": "28-10-2016",
"counts": [
{ "status": "success", "count": 10 },
{ "status": "failure", "count": 10 }
]
},
{
"_id": "29-10-2016",
"counts": [
{ "status": "success", "count": 10 },
{ "status": "failure", "count": 10 }
]
}
]
फिर एक वैकल्पिक पाइपलाइन को निम्नानुसार चलाने पर विचार करें
Orders.aggregate([
{
"$group": {
"_id": {
"date": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$created_at"
}
},
"status": { "$toLower": "$status" }
},
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": "$_id.date",
"counts": {
"$push": {
"status": "$_id.status",
"count": "$count"
}
}
}
}
], function (err, orders){
if (err) throw err;
console.log(orders);
})