2013-07-23 145 views
1

我使用下面的架构从MongoDB的FAQ如何使用聚合框架将动态属性中的mongo db分组?

{ 
    attrib : [ 
     { k: "color", v: "red" }, 
     { k: "shape", v: "rectangle" }, 
     { k: "color", v: "blue" }, 
     { k: "avail", v: true } 
     ] 
} 

我怎样才能组和例如计数集合通过“颜色”?如果可能的话,我宁愿使用聚合框架而不使用map reduce。

我的结果应该是这样的:

[ 
    { 
     v: "blue", 
     count: 5 
    }, 
    { 
     v: "red", 
     count: 2 
    }, 
    { 
     v: "black", 
     count: 52 
    } 
] 
+0

你能多一点点的描述对哪些文件你有作为输入和你期望的输出? – Derick

+0

如果您只想计算文档,请尝试使用'.find({“attrib.k”:“color”})。count()'。如果你想要更复杂的文件内的发生次数,请提供更多信息,如预期输出:) – randunel

+0

我刚刚添加了我的预期输出。 – joafeldmann

回答

2

这是相当琐碎的,我们需要做一个放松身心的比赛,然后一组由:

db.so.aggregate([ 
    { $unwind : '$attrib' }, 
    { $match: { 'attrib.k' : 'color' } }, 
    { $group: { _id: '$attrib.v', count: { '$sum': 1 } } } 
]); 

开卷炸毁“ attrib“数组合成一个文件:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "color", 
       "v" : "red" 
      } 
     }, 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "shape", 
       "v" : "rectangle" 
      } 
     }, 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "color", 
       "v" : "blue" 
      } 
     }, 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "avail", 
       "v" : true 
      } 
     } 
    ], 
    "ok" : 1 
} 

匹配然后删除所有非颜色项目:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "color", 
       "v" : "red" 
      } 
     }, 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "color", 
       "v" : "blue" 
      } 
     } 
    ], 
    "ok" : 1 
} 

和集团最终使得其返回:

{ 
    "result" : [ 
     { 
      "_id" : "blue", 
      "count" : 1 
     }, 
     { 
      "_id" : "red", 
      "count" : 1 
     } 
    ], 
    "ok" : 1 
} 

(以上所有输出是刚刚从你单样本文档)

+0

谢谢!你认为,使用聚合框架比使用map/reduce更好/更快吗? – joafeldmann

+0

是的,因为它不会以这种方式进入JavaScript。 – Derick

+0

还有一个问题:如何包含/组合对象,其中color属性根本不存在? – joafeldmann

相关问题