我正在尝试获取具有不同大小的数组的记录数的列表。我想获取所有记录的数组大小的分布,以便我可以构建如下直方图:
| *
| *
documents | * *
| * * *
|_*__*__*___*__*___
2 5 6 23 47
Array Size
所以原始文档看起来像这样:
{hubs : [{stuff:0, id:6}, {stuff:1"}, .... ]}
{hubs : [{stuff:0, id:6}]}`
到目前为止使用聚合框架和一些帮助here我想出了
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 }}])
最佳答案
现在 2.6 已经发布,聚合框架支持 new array operator $size
这将允许您$project
数组大小,而无需展开和重新分组。
db.sitedata.aggregate([{ $project:{ 'count': { '$size':'$hubs'} } },
{ $group : {_id:'$count', count:{$sum:1} } },
{ $sort : { _id: 1 } } ] )
关于mongodb - 使用 MongoDB 聚合框架获取数组大小直方图的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16089493/