2013-04-04 13 views
7

でユニークなアイテムを取得するにはここに私のMongoDBのコレクションです:のMongoDB - 集約 - 配列

{ 
    "_id" : ObjectId("515d8f53175b8ecb053425c2"), 
    "category" : "Batteries", 
    "products" : [ 
     { 
      "brand" : "Duracell", 
      "item" : [ 
       "AA", 
       "AAA" 
      ] 
     }, 
     { 
      "brand" : "Everyday", 
      "item" : [ 
       "9V", 
       "AA", 
       "12V" 
      ] 
     } 
    ] 
} 

私は必要な出力が

1である)すべての項目のユニークなリスト

{["AA", "AAA", "9V", "12V"]} 

はと 2.製品ごとのユニークな商品リスト

{ 
    "category" : "Batteries", 
    "item": ["AA", "AAA", "9V", "12V"] 
} 

MongoDBの新機能ですが、別の集計関数を試してみましたが、何も動かないようです。助けてください。

答えて

14

もう少し試してみたら、私はこれを解決しました。ここでのコマンドがあります:

db.xyz.aggregate({$project: {a: '$products.item'}}, 
    {$unwind: '$a'}, 
    {$unwind: '$a'}, 
    {$group: {_id: 'a', items: {$addToSet: '$a'}}}); 

db.xyz.aggregate({$project: {category: 1, a: '$products.item'}}, 
    {$unwind: '$a'}, 
    {$unwind: '$a'}, 
    {$group: {_id: '$category', items: {$addToSet: '$a'}}}); 
+4

なぜ$を2回巻き戻していますか? – Devesh

+6

'item'は配列内にネストされています。 – Ananth

0

集計関数で試したことがすべてわかりませんが、私はアンワインドが同じことをするのに役立つだろうと思っています。それを達成できないと仮定した場合、map-reduceはこれを簡単に行う。 http://docs.mongodb.org/manual/applications/map-reduce/を見ることができます。それはあなたが望む方法でデータを取得することができ、あなたは簡単にリストを取得することができます。私はタグの列で$ unwindと思って$ groupは、あなたが1であなたが必要とする別のタグのリストを与え、2番目のケースでは、2つの主要カテゴリと$ unwind以前のitemで$ groupを作成します。

+0

Devesh、ご回答いただきありがとうございます。私はちょうど集合でこれを解決することができました。私の答えも掲示しました。 – Ananth