2013-04-22 14 views
22

Powiedzmy mam następujące dokumenty w kolekcji:MongoDB: Jak uzyskać wyraźną listę wartości pól pod-dokumentu?

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

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

Teraz chcę się jakoś następującą listę unikalnych nazw podrzędnych przejechać wszystkie rodziny:

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

Struktura wyniku może być inna. Jak to osiągnąć w MongoDB? Powinno być coś prostego, ale nie mogę dojść do tego. Próbowałem funkcji aggregate() w kolekcji, ale nie wiem, jak zastosować funkcję distinct().

+0

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

Odpowiedz

46

Można po prostu zrobić:

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

W twoim przypadku to zwraca:

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

Cholera, takie proste! Pęknąłem głową. Dzięki temu jest to najkrótsza działająca odpowiedź, dając mi dokładnie to, czego chcę. – vladimir

+2

ok - ale co z wydajnością na klastrze z shardowaniem? odrębny będzie przetwarzany na przykład w każdej instancji rs;) –

+1

Oczywiście w tym momencie nie myślę jeszcze o wydajności. Ale to jest ważne, dzięki. – vladimir

5

z ramami pomocy agregacji:

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

lub więcej miejsca;) z częstotliwością nazwą:

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

ale nie o to poprosił - chce odrębne nazwy tablicy nie Dokumenty podrzędne z każdej nazwy i jej liczenia ... –

+0

ja ją przeczytać : > "Struktura wyniku może być inna." i tak !, to jest inna struktura;) –

+0

Tak, dziękuję. Działa i zmusza mnie, aby dowiedzieć się więcej o agregacji() – vladimir

Powiązane problemy