2013-04-04 70 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

你为什么要两次展开? – Devesh 2013-04-05 03:08:14

+6

,因为'item'嵌套在数组中。 – Ananth 2013-04-06 01:38:24

0

我不确定你在聚合功能中所尝试的是什么,但我认为放松会帮助你做同样的事情,假设你无法完成它,我们有一个map-reduce,它可以让你轻松做到这一点。您可以查看http://docs.mongodb.org/manual/applications/map-reduce/。它允许您以您想要的方式获取数据,并且您可以轻松获取该列表。我认为$放在标签列上,然后$组他们将总是根据您在1中的要求给我们不同的标签列表,并在第二种情况下在两个关键类别和项目之前创建$组,以便$更早退出。

+0

Devesh,感谢您的答复。我能够通过聚合来解决这个问题。发布我的答案以及。 – Ananth 2013-04-04 23:33:18