【问题标题】:Fastest way to get histogram of array sizes using MongoDB aggregation framework使用 MongoDB 聚合框架获取数组大小直方图的最快方法
【发布时间】:2013-04-18 17:28:16
【问题描述】:

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

          | *
          | *
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 }}])

【问题讨论】:

  • 没有办法一次性完成此操作,因为在完成对第一个分组的计数之前,您无法开始对结果进行计数/分组。您使用的是哪个版本的 MongoDB?
  • 对了,需要多长时间?
  • 好的,我怀疑可能是这种情况(不允许嵌套,只能链接)。大约需要 4 秒,这还算不错,但我希望能达到亚秒级。我可以调整我的数据而不是现在调整查询。
  • 对,加快速度的一种方法是在推送新元素时通过计数器的增量来预先汇总总和,尽管可能还有其他的 - 你要进入多少个文档管道(它是完整的集合还是你先做某种 $match ?)
  • 我没有先做 $match 因为它是参考数据汇总。它只有大约 60,000 条记录,但有相当多的管道处理。我同意向记录添加计数可能是通过删除管道中的 $group 之一来加速查询的最佳选择。

标签: mongodb aggregation-framework


【解决方案1】:

现在 2.6 已经发布,聚合框架支持 new array operator $size,这将允许您 $project 数组大小而无需展开和重新分组。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2013-07-31
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多