2013-04-22 18 views
22

Diciamo che ho i seguenti documenti in collezione:MongoDB: come ottenere un elenco distinto dei valori del campo del sottocampo?

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

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

Ora voglio ottenere in qualche modo il seguente elenco di nomi di bambini unici attraversare tutte le famiglie:

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

Struttura di risultato potrebbe essere diverso. Come raggiungerlo in MongoDB? Dovrebbe essere qualcosa di semplice ma non riesco a capire. Ho provato la funzione aggregate() sulla raccolta ma poi non so come applicare la funzione distinct().

+0

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

risposta

46

Devi solo può fare:

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

Nel tuo caso restituisce:

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

Accidenti, così facile! Mi sono rotto la testa. Grazie questa è la risposta lavorativa più corta, dandomi esattamente quello che voglio. – vladimir

+2

ok - ma per quanto riguarda le prestazioni sul cluster di sharding? distinti saranno trattati su ogni istanza di rs per esempio;) –

+1

Ovviamente non sono a quel punto pensando ancora alla performance. Ma questa è una cosa significativa, grazie. – vladimir

5

con il quadro aiuto di aggregazione:

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

o più interesse;) con la frequenza del nome:

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

ma non è quello che ha chiesto, vuole array di nomi distinti non documenti secondari con ciascun nome e il suo conteggio ... –

+0

ho letto : > "La struttura del risultato potrebbe essere diversa." e sì !, questa è una struttura diversa;) –

+0

Sì, grazie. Funziona, e mi costringe a saperne di più su aggregato() – vladimir

Problemi correlati