2013-09-02 8 views
8

Sagen wir, ich habe eine Sammlung ‚Menschen‘ mit den folgenden Dokumenten genannt:Wie verketten Sie Arrays aus mehreren Dokumenten in MongoDB?

{ 
    "name": "doug", 
    "colors": ["blue", "red"] 
} 

{ 
    "name": "jack", 
    "colors": ["blue", "purple"] 
} 

{ 
    "name": "jenny", 
    "colors": ["pink"] 
} 

Wie würde ich eine verkettete Array aller colors Sub-Arrays, das heißt zu bekommen?

["blue", "red", "blue", "purple", "pink"] 

Antwort

15

Try Aggregat verwenden:

db.people.aggregate([ 
    {$unwind:"$colors"}, 
    {$group:{_id:null, clrs: {$push : "$colors"} }}, 
    {$project:{_id:0, colors: "$clrs"}} 
]) 

Ergebnis:

{ 
"result" : [ 
    { 
     "colors" : [ 
      "blue", 
      "red", 
      "blue", 
      "purple", 
      "pink" 
     ] 
    } 
], 
"ok" : 1 
} 

Aktualisiert

Wenn Sie in Ergebnis Array eindeutige Werte erhalten möchten, können Sie $addToSet nutzen könnten Operator anstelle von $push in der $group Bühne.

+0

HI, aber wenn ich einen einzigartigen Wert im Ergebnis brauche, wie ich das erreichen werde, da dies doppelte Einträge in diesem Array geben wird – viren

+2

Sicher. Um dies zu tun, könnten Sie den '$ push' Operator mit' $ addToSet' in '{$ group: {_ id: null, clrs: {$ push:" $ colors "}}}, string ändern. –

17

Nun, Try sollte gut für Sie arbeiten !!

db.people.distinct("colors") 
+1

einfach und effizient! Diese Antwort sollte die akzeptierte sein. – Mithril

+0

sehr gut, genau was ich brauchte; Es ist auch gut zu wissen, dass Sie eine optionale Abfrage an 'distinct' übergeben können, um die Ergebnisse herauszufiltern. [Quelle] (https://docs.mongodb.com/manual/reference/method/db.collection.distinct/#specify-query-with-distinct) – zaboco

+0

Danke Mann, genau das, was ich brauchte :) –

Verwandte Themen