आप $arrayToObject
के उपयोग का लाभ उठा सकते हैं
पाइपलाइनों की एक श्रृंखला के भीतर ऑपरेटर और एक अंतिम $replaceRoot
कोड>
वांछित परिणाम प्राप्त करने के लिए पाइपलाइन।
नोट :hubId
पाइपलाइन संचालन के दौरान $arrayToObject<के रूप में एक स्ट्रिंग में कनवर्ट किया जाता है /कोड>
यदि "कुंजी" मान एक स्ट्रिंग है तो ऑपरेटर अच्छी तरह से काम करता है। तो अगर hubId
एक ObjectId है तो $toString
जरूरत तब पड़ती है जब $arrayToObject
लागू किया जाता है।
आपको निम्नलिखित समग्र पाइपलाइन चलाने की आवश्यकता होगी:
Product.aggregate([
{ "$group": {
"_id": {
"hubId": "$hubId",
"status": "$ProductStatus"
},
"count": { "$sum": 1 }
} },
{ "$group": {
"_id": "$_id.hubId",
"counts": {
"$push": {
"k": "$_id.status",
"v": "$count"
}
}
} },
{ "$group": {
"_id": null,
"counts": {
"$push": {
"k": { "$toString": "$_id" },
"v": "$counts"
}
}
} },
{ "$addFields": {
"counts": {
"$map": {
"input": "$counts",
"in": {
"$mergeObjects": [
"$$this",
{ "v": { "$arrayToObject": "$$this.v" } }
]
}
}
}
} },
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$counts" }
} }
])
जो निम्नलिखित परिणाम दस्तावेज़ देता है:
{
"xyz" : {
"Delivered" : 1,
"On the Way" : 1
},
"mlm" : {
"On the Way" : 1,
"Delivered" : 2
},
"yyy" : {
"On the Way" : 1,
"Delivered" : 1,
"Cancelled" : 1
}
}
यह निश्चित रूप से दूसरी स्थिति उत्पन्न नहीं करता है जिसमें शून्य गिनती है लेकिन समाधान एक अच्छा प्रारंभिक बिंदु हो सकता है।