11

我正在尝试获取具有不同大小数组的记录数的列表。我想获取所有记录的数组大小分布,以便可以构建这样的直方图:

          | *
          | *
documents | *         *
          | *  *      *
          |_*__*__*___*__*___
            2  5  6  23  47

               Array Size

所以原始文档看起来像这样:

{hubs : [{stuff:0, id:6}, {stuff:1"}, .... ]}
{hubs : [{stuff:0, id:6}]}`

到目前为止,我使用了聚合框架和一些帮助

db.sitedata.aggregate([{ $unwind:'$hubs'}, 
                       { $group : {_id:'$_id', count:{$sum:1}}}, 
                       { $group : {_id:'$count', count:{$sum:1}}},
                       { $sort  : {_id: 1}}])

这似乎给了我想要的结果,但速度不是很快。我想知道是否有一些我可以做这样的事情,可能不需要两个群组通话。这里的语法是错误的,但我想做的是将计数值放在第一个 _id 字段中:

db.sitedata.aggregate([{ $unwind:'$hubs'}, 
                       { $group : {_id:{$count:$hubs}, count:1}},
                       { $sort  : { _id: 1 }}])
4

1 回答 1

7

现在 2.6 已经发布,聚合框架支持一个新的数组运算符$size,它允许您$project调整数组大小,而无需展开和重新分组。

db.sitedata.aggregate([{ $project:{ 'count': { '$size':'$hubs'} } }, 
                       { $group : {_id:'$count', count:{$sum:1} } },
                       { $sort  : { _id: 1 } } ] )
于 2014-04-26T06:54:10.677 回答