2012-09-16 14 views
27

मेरे पास छात्रों और उनके संपर्क विवरण का डेटाबेस है। मैं पोस्टकोड को खोजने की कोशिश कर रहा हूं जिसमें अधिकांश छात्र हैं। छात्रों के लिए दस्तावेजों कुछ इस तरह दिखाई ...mongodb एकत्रीकरण क्रम

{studentcode: 'smi0001', firstname: 'बॉब', उपनाम: 'स्मिथ', पोस्टकोड: 2001}

मैं सोचा मैं एकत्रीकरण ढांचे इस्तेमाल कर सकते हैं पता लगाने के लिए कुछ की तरह कार्य करके सबसे छात्रों के साथ पोस्टकोड ...

db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}}) 

इस काम करता है के रूप में उम्मीद (_id के रूप में डाक कोड और में छात्रों की संख्या देता है प्रत्येक पोस्टकोड 'छात्र' के रूप में, लेकिन यदि मैं पाइपलाइन पर $sort जोड़ता हूं तो यह $group ऑपरेशन के परिणामों के बजाय पूरे छात्र संग्रह द्वारा सॉर्ट करने का प्रयास करता है।

क्या मैं देखो की तरह कोशिश कर रहा हूँ ...

db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}, $sort: {_id: -1}}) 

लेकिन यह पूरे संग्रह वापस आती है और $project और $group ... मुझे याद आ रही कुछ की उपेक्षा? मैंने सोचा कि मैं सिर्फ छात्रों की अवरोही संख्या से क्रमबद्ध करने और पहले आइटम को वापस करने में सक्षम हूं। किसी भी मदद के लिए अग्रिम धन्यवाद।

उत्तर

47

आप लगभग यह था ...

db.test.aggregate(
    {$group: {_id: '$postcode', students: {$sum: 1}}}, 
    {$sort: {_id: -1}} 
); 

देता है (मैं अपने नमूना मिलान कुछ परीक्षण डेटा जोड़ा):

{ 
    "result" : [ 
    { 
     "_id" : 2003, 
     "students" : 3 
    }, 
    { 
     "_id" : 2002, 
     "students" : 1 
    }, 
    { 
     "_id" : 2001, 
     "students" : 2 
    } 
    ], 
    "ok" : 1 
} 

आप एक बाहरी {} सब कुछ के आसपास है, जो कुछ भ्रम की स्थिति पैदा कर रहा था था । समूह और क्रम पाइपलाइन में अलग-अलग संचालन के रूप में काम नहीं कर रहे थे।

आपको इस मामले के लिए वास्तव में परियोजना की आवश्यकता नहीं थी।

अद्यतन आप शायद इसलिए की तरह, "छात्रों" से सॉर्ट करने के, (जनसंख्या की दृष्टि से) सबसे बड़ी zipcodes पाने के लिए पहले हैं:

db.test.aggregate(
    {$group: {_id: '$postcode', students: {$sum: 1}}}, 
    {$sort: {students: -1}} 
); 
+0

सलाह के लिए धन्यवाद ढेर। मुझे विश्वास नहीं है कि यह सिर्फ एक गलत जगह वाली ब्रैकेट समस्या थी। ये 15 साल पहले एसक्यूएल सीखने के लिए उपयोग की जाने वाली समस्याओं की तरह हैं, मोंगोडब में जाने का मतलब बहुत पहले ज्ञान के पीछे छोड़ना है, लेकिन मुझे लगता है कि यह इसके लायक होगा। चीयर्स, –

+0

यह आपके उपयोग के मामले के लिए काम करता है, लेकिन यह दृष्टिकोण हमेशा उन परिणामों की गारंटी नहीं देता है जिन्हें आप देखना चाहते हैं। उदाहरण के लिए परिणाम गलत होंगे जब आपको 'फ़ील्ड 1' द्वारा समूहबद्ध करने की आवश्यकता है, लेकिन इसे 'field2' द्वारा क्रमबद्ध रखें। – astronaut

+0

मेरे पास POST1, POST2, POST3 पोस्टकोड था, प्रत्येक पोस्ट कोड में छात्रों की संख्या के विपरीत है। प्रत्येक POST के योग प्राप्त करने के लिए मेरी तरह की क्वेरी क्या होनी चाहिए। db.test.aggregate ( {$ समूह: {_id: {'पोस्टकोड': '$ पोस्टकोड'}, छात्र: {$ sum: 1}}}, यहां सॉर्ट क्वेरी क्या होनी चाहिए। ); –

3

मुझे लगता है कि अपने वाक्य रचना थोड़ा गलत है। पाइपलाइन में प्रत्येक एकत्रीकरण ऑपरेशन अपना स्वयं का दस्तावेज़ होना चाहिए।

db.students.aggregate({$project: ...}, {$group: ...}, {$sort: ...}) 

आपके मामले में, यह होना चाहिए:

db.students.aggregate(
    {$project: { postcode: 1 }}, 
    {$group: {_id: '$postcode', students: {$sum: 1}}}, 
    {$sort: {students: -1}} 
) 

मैं अपने स्कीमा के आधार पर एक नमूना संग्रह पर यह परीक्षण किया है और यह मेरे लिए काम करता है, छात्रों की संख्या के आधार पर वर्गीकृत पोस्ट कोड छँटाई उतरना

+0

क्या इस मामले में '$ प्रोजेक्ट 'आपके लिए कुछ भी करता है? –

+0

@WesFreeman आप सही हैं, $ परियोजना छोड़ी जा सकती है। मुझे लगता है कि यदि आपके पास वास्तव में बड़े दस्तावेज़ थे, तो उन्हें पाइपलाइन में आगे की प्रक्रिया के लिए केवल आवश्यक जानकारी तक सीमित करना लाभ का हो सकता है, लेकिन इस मामले में, ज्यादा प्राप्त नहीं किया जाता है। – Thomas

+0

हाँ, मेरे 'छात्र' दस्तावेज़ों में वास्तव में एक ढेर अधिक फ़ील्ड हैं, इसलिए मैं अनियंत्रित फ़ील्ड को काटने के लिए प्रोजेक्ट का उपयोग कर रहा हूं। –

संबंधित मुद्दे