MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB समूह और कुंजी के रूप में आईडी के साथ योग

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>


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. डोकर के साथ MongoDB पहले कनेक्ट पर सर्वर [लोकलहोस्ट:27017] से कनेक्ट करने में विफल रहा

  2. डॉकर कंटेनर के डिस्क उपयोग का विश्लेषण कैसे करें

  3. सी # के साथ कुल $ लुकअप

  4. क्वेरी में मौजूद नहीं फ़ील्ड वाले खोज परिणाम दस्तावेज़ों से कैसे निकालें?

  5. MongoDB क्वेरी ऑप्टिमाइज़ेशन