2013-09-02 7 views
8

はのは、私は、次の書類を「人」と呼ばれるコレクションを持っているとしましょう:MongoDBの複数の文書から配列を連結するには?

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

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

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

は、どのように私は、すなわち、すべてのcolorsサブアレイの連結配列を取得しますか?

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

答えて

15

てみ集計を使用する:

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

結果:

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

あなたは結果の配列内の一意の値を取得したい場合は、あなたが$addToSetを使用することができ

を更新しました演算子の代わりにステージのステージ。

+0

こんにちはしかし、私はこの配列で重複したエントリを与えるので、私はそれを達成する方法で結果にユニークな値が必要な場合 – viren

+2

確かに。これを行うには、{$ group:{_ id:null、clrs:{$ push: "$ colors"}}}、 'stringの' $ addToSet'で '$ push'演算子を変更することができます。 –

17

よくお試しください!

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

シンプルで効率的!この回答は受け入れられるものでなければなりません。 – Mithril

+0

非常に良い、まさに私が必要としたもの。オプションのクエリを 'distinct'に渡して結果を除外できることも知っておいてください。 [ソース](https://docs.mongodb.com/manual/reference/method/db.collection.distinct/#specify-query-with-distinct) – zaboco

+0

ありがとうございました。まさに私が必要でした:) –

関連する問題