2013-04-22 19 views
22

ı koleksiyonunda aşağıdaki belgeleri var diyelim: sonucunMongoDB: Alt belge alanı değerlerinin ayrı bir listesi nasıl alınır?

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

Yapısı farklı olabilir:

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

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

Şimdi tüm aileleri çapraz bir şekilde benzersiz çocuk isimleri aşağıdaki listeyi almak istiyorum. MongoDB'de bunu nasıl başarabilirim? Basit bir şey olmalı ama anlayamıyorum. Toplamada aggregate() işlevini denedim, ancak distinct() işlevini nasıl uygulayacağımı bilmiyorum.

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

veya daha fazla ilgi;) adının frekans ile: yardım toplama çerçevesine

+0

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

cevap

46

Sen tıpkı yapabilirsiniz: Senin durumunda

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

o döndürür:

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

Lanet, çok kolay! Kafamı kırdım. Teşekkürler bu en kısa çalışma cevabı, bana tam olarak ne istediğimi veriyor. – vladimir

+2

tamam - peki ya da sharding cluster'da performans hakkında ne düşünüyorsunuz? her rs örneğinde ayrı olarak işlenecektir;) –

+1

Açıkçası o noktada henüz performans düşünmüyorum. Ama bu önemli bir şey, teşekkürler. – vladimir

5

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

ama istediği bu değil - farklı isimler dizisi her isim ve sayıları ile alt belgeleri değil ... –

+0

bunu okuyorum : > "Sonuç yapısı farklı olabilir." ve evet !, bu farklı bir yapıdır;) –

+0

Evet, teşekkürler. Çalışır ve agregate() – vladimir