mongodb - 使用 MongoDB 聚合框架获取数组大小直方图的最快方法

标签 mongodb aggregation-framework

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

          | *
          | *
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/

相关文章:

mongodb - 将 Mongo shell 脚本转换为 SpringData/Java

mongodb - 计算重复值的出现次数

mongodb - 使用 MongoDB 压缩数组

java - mongoDB中按ID分组

mongodb - $查找结果中的 $match

mongodb - 聚合管道抛出错误 "A pipeline stage specification object must contain exactly one field."

java - 使用 mongorepository 更新特定字段

mongodb - 在mongo中随机排序结果集

mongodb - 为什么使用空条件时 $pull 运算符在 MongoDB 上不起作用?

javascript - MongoError : Topology is closed, 请连接(client.close 和 client.connect 问题)