MongoDb 3.6 और नए के साथ, आप $arrayToObject
के उपयोग का लाभ उठा सकते हैं ऑपरेटर और एक $replaceRoot
वांछित परिणाम प्राप्त करने के लिए पाइपलाइन। आपको निम्नलिखित समग्र पाइपलाइन चलाने की आवश्यकता होगी:
db.users.aggregate([
{
"$group": {
"_id": { "$toLower": "$role" },
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": null,
"counts": {
"$push": {
"k": "$_id",
"v": "$count"
}
}
}
},
{
"$replaceRoot": {
"newRoot": { "$arrayToObject": "$counts" }
}
}
])
पुराने संस्करणों के लिए, $cond
$group
. में ऑपरेटर भूमिका क्षेत्र मूल्य के आधार पर गणनाओं का मूल्यांकन करने के लिए पाइपलाइन चरण का प्रभावी ढंग से उपयोग किया जा सकता है। वांछित प्रारूप में परिणाम देने के लिए आपकी समग्र एकत्रीकरण पाइपलाइन का निर्माण निम्नानुसार किया जा सकता है:
db.users.aggregate([
{
"$group": {
"_id": null,
"moderator_count": {
"$sum": {
"$cond": [ { "$eq": [ "$role", "moderator" ] }, 1, 0 ]
}
},
"superadmin_count": {
"$sum": {
"$cond": [ { "$eq": [ "$role", "superadmin" ] }, 1, 0 ]
}
},
"user_count": {
"$sum": {
"$cond": [ { "$eq": [ "$role", "user" ] }, 1, 0 ]
}
},
"admin_count": {
"$sum": {
"$cond": [ { "$eq": [ "$role", "admin" ] }, 1, 0 ]
}
}
}
},
{
"$project": {
"_id": 0,
"moderator": "$moderator_count",
"superadmin": "$superadmin_count",
"user": "$user_count",
"admin": "$admin_count"
}
}
])
टिप्पणियों के निशान से, यदि आप पहले से भूमिकाओं को नहीं जानते हैं और गतिशील रूप से पाइपलाइन सरणी बनाना चाहते हैं, तो distinct
चलाएं भूमिका क्षेत्र पर आदेश। यह आपको एक ऐसी वस्तु देगा जिसमें विशिष्ट भूमिकाओं की एक सूची होगी:
var result = db.runCommand ( { distinct: "users", key: "role" } )
var roles = result.values;
printjson(roles); // this will print ["moderator", "superadmin", "user", "admin"]
अब ऊपर दी गई सूची को देखते हुए, आप एक ऑब्जेक्ट बनाकर अपनी पाइपलाइन को असेंबल कर सकते हैं, जिसके गुण जावास्क्रिप्ट के reduce()
का उपयोग करके सेट किए जाएंगे। तरीका। निम्नलिखित इसे प्रदर्शित करता है:
var groupObj = { "_id": null },
projectObj = { "_id": 0 }
var groupPipeline = roles.reduce(function(obj, role) { // set the group pipeline object
obj[role + "_count"] = {
"$sum": {
"$cond": [ { "$eq": [ "$role", role ] }, 1, 0 ]
}
};
return obj;
}, groupObj );
var projectPipeline = roles.reduce(function(obj, role) { // set the project pipeline object
obj[role] = "$" + role + "_count";
return obj;
}, projectObj );
अपनी अंतिम एकत्रीकरण पाइपलाइन में इन दो दस्तावेज़ों का उपयोग इस प्रकार करें:
db.users.aggregate([groupPipeline, projectPipeline]);
नीचे डेमो देखें।
var roles = ["moderator", "superadmin", "user", "admin"],
groupObj = { "_id": null },
projectObj = { "_id": 0 };
var groupPipeline = roles.reduce(function(obj, role) { // set the group pipeline object
obj[role + "_count"] = {
"$sum": {
"$cond": [ { "$eq": [ "$role", role ] }, 1, 0 ]
}
};
return obj;
}, groupObj );
var projectPipeline = roles.reduce(function(obj, role) { // set the project pipeline object
obj[role] = "$" + role + "_count";
return obj;
}, projectObj );
var pipeline = [groupPipeline, projectPipeline]
pre.innerHTML = JSON.stringify(pipeline, null, 4);
<pre id="pre"></pre>