2013-04-22 5 views
22

मान लीजिए कि मैं संग्रह में निम्नलिखित दस्तावेज करते हैं:MongoDB: सब-दस्तावेज़ फ़ील्ड मानों की अलग सूची कैसे प्राप्त करें?

{ 
    "family": "Smith", 
    "children": [ 
     { 
      "child_name": "John" 
     }, 
     { 
      "child_name": "Anna" 
     }, 
    ] 
} 

{ 
    "family": "Williams", 
    "children": [ 
     { 
      "child_name": "Anna" 
     }, 
     { 
      "child_name": "Kevin" 
     }, 
    ] 
} 

अब मैं किसी भी तरह अद्वितीय बच्चे के नाम की निम्न सूची प्राप्त करना चाहते हैं सभी परिवारों को पार:

[ "John", "Anna", "Kevin" ] 

परिणाम की संरचना अलग हो सकता है। मोंगो डीबी में इसे कैसे प्राप्त किया जाए? कुछ आसान होना चाहिए लेकिन मैं समझ नहीं सकता। मैंने संग्रह पर कुल() फ़ंक्शन का प्रयास किया लेकिन फिर मुझे नहीं पता कि अलग() फ़ंक्शन कैसे लागू करें।

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name'}}]) 

या अधिक ब्याज;) नाम की आवृत्ति के साथ:

+0

http://docs.mongodb.org/manual/core/map-reduce/ –

उत्तर

46

तुम सिर्फ कर सकते हैं:

db.collection.distinct("children.child_name"); 

आपके मामले में यह रिटर्न:

[ "John", "Anna", "Kevin" ] 
+2

अरे, इतना आसान! मैंने अपना सिर तोड़ दिया। धन्यवाद यह सबसे छोटा कामकाजी जवाब है, जो मुझे वही देता है जो मुझे चाहिए। – vladimir

+2

ठीक है - लेकिन शेर्डिंग क्लस्टर पर प्रदर्शन के बारे में क्या? उदाहरण के लिए प्रत्येक आरएस उदाहरण पर अलग-अलग संसाधित किया जाएगा;) –

+1

स्पष्ट रूप से मैं उस बिंदु पर अभी तक प्रदर्शन की सोच नहीं कर रहा हूं। लेकिन यह महत्वपूर्ण बात है, धन्यवाद। – vladimir

5
मदद एकत्रीकरण ढांचे के साथ

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name', freq:{$sum:1}}}]) 
+0

लेकिन वह वह नहीं है जिसे उसने पूछा - वह अलग-अलग नाम सरणी प्रत्येक नाम और इसकी गिनती के साथ उप-दस्तावेज नहीं चाहता ... –

+0

मैंने इसे पढ़ा : > "परिणाम का संरचना अलग हो सकता है।" और हाँ !, यह एक अलग संरचना है;) –

+0

हाँ, धन्यवाद। यह काम करता है, और मुझे कुल() – vladimir

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