MongoDB चयन काउंटी समूह द्वारा


180

मैं MongoDB के साथ खेल रहा हूं ताकि यह पता लगाने की कोशिश करूं कि एक सरल कैसे करना है

SELECT province, COUNT(*) FROM contest GROUP BY province

लेकिन मैं इसे कुल फ़ंक्शन का उपयोग करके पता नहीं लगा सकता। मैं इसे कुछ वास्तव में अजीब समूह वाक्यविन्यास का उपयोग करके कर सकता हूं

db.user.group({
    "key": {
        "province": true
    },
    "initial": {
        "count": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.count += true.length;
        else prev.count++;
    }
});

लेकिन क्या कुल कार्य का उपयोग करने का एक आसान / तेज़ तरीका है?

जवाबों:


326

यह इसका उपयोग करने का आसान तरीका होगा aggregate:

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])

1
जब मुझे लगता है कि मुझे एक त्रुटि संदेश मिलता है "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
स्टीवन

आप इसे कैसे क्रमित करते हैं? मैं -1 से
फिल्ट

4
@FilipBartuzi प्रलेखन पेज में एक उदाहरण है, तो आप पाइपलाइन के लिए एक तरह से आपरेशन को जोड़ने के लिए, के रूप में होगा{ $sort: { count: -1 } }
elaich

मुझे @Steven के समान अपवाद मिला और ऐसा इसलिए हुआ क्योंकि मैंने सिर्फ पंक्ति 2 को कॉपी किया और आसपास के वर्ग कोष्ठकों को छोड़ दिया।
पीटर पेर्क

यदि आप mongoDB में संबंधित प्रश्नों के लिए कर सकते हैं तो pls मदद करें - stackoverflow.com/questions/61067856/…
newdeveloper

66

मुझे कुल कार्य के परिणाम के आधार पर कुछ अतिरिक्त संचालन की आवश्यकता है। अंत में मुझे समुच्चय समारोह और MongoDB में परिणाम के आधार पर संचालन के लिए कुछ समाधान मिला है। मेरे पास Requestफ़ील्ड के साथ एक संग्रह है request, source, status, requestDate

एकल फ़ील्ड समूह द्वारा और गणना:

db.Request.aggregate([
    {"$group" : {_id:"$source", count:{$sum:1}}}
])

एकाधिक फ़ील्ड्स समूह द्वारा और गणना:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])

एकाधिक फ़ील्ड्स फ़ील्ड के आधार पर सॉर्ट करें:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"_id.source":1}}
])

एकाधिक फ़ील्ड्स समूह द्वारा और गणना के साथ क्रमबद्ध गणना का उपयोग करके:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])

50

यदि आपको समूह के लिए कई स्तंभों की आवश्यकता है, तो इस मॉडल का पालन करें। यहाँ मैं एक गिनती कर रहा हूँ statusऔर type:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })

2
_ कई क्षेत्रों को एनकैप्सुलेट करने के लिए एक डिफ़ॉल्ट परम का प्रतिनिधित्व करता है?
यूजेन Sunic

18

इसके अतिरिक्त यदि आपको उस समूहीकरण को प्रतिबंधित करने की आवश्यकता है जिसका आप उपयोग कर सकते हैं:

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)

17

MongoDB 3.4 में शुरू, आप $sortByCountएकत्रीकरण का उपयोग कर सकते हैं ।

एक निर्दिष्ट अभिव्यक्ति के मूल्य के आधार पर आने वाले दस्तावेजों को समूह, फिर प्रत्येक अलग समूह में दस्तावेजों की गणना करता है।

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

उदाहरण के लिए:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);

2
संभवतः यहाँ ध्यान देने योग्य बात है कि $sortByCountवास्तव में एक "छद्म संचालक" है, जैसे MongoDB 3.4 से शुरू किए गए कई और एकत्रीकरण चरण संचालक। वे सभी वास्तव में अपने संबंधित एकत्रीकरण चरणों में विस्तारित हैं । इस मामले में एक में $groupसाथ $sum: 1-साथ मौजूदा जवाब और एक अतिरिक्त में दिखाया $sort चरण। वे "कम कोड टाइप करने" के अलावा कोई लाभ नहीं देते हैं , जो अधिक वर्णनात्मक हो सकता है या नहीं (यदि आप उस तरह के हैं)। IMHO, कोड में अलग $groupऔर $sortचरण कहीं अधिक वर्णनात्मक और वास्तव में अधिक लचीले हैं।
नील लून


0

मेरे लिए काम करने वाले मैंगो शेल कमांड:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.