【问题标题】:Slow aggregate - mongodb慢聚合——mongodb
【发布时间】:2017-07-24 20:37:36
【问题描述】:

我有一个 MongoDB 集合,其中包含一些网站爬虫的结果。 文档架构看起来或多或少像这样:

{
  mainID: "number",
  // sometimes very big, up to 10,000 right now
  links: [
    {
        foo: 'bar',
    },
    //... more documents
  ]
}

我需要查询此集合以获取用户帐户的一些统计信息。为每个 mainID 最后插入的每个文档计算统计信息。

所有文档都是 mainID 的报告(经常插入)。

我目前使用此查询一次获取所有数据(在对每个 mainID 进行查询之前,如果不完全相同,时间也是相似的):

db.getCollection('collectionName').aggregate([
{
            $match: {
              mainID: {
                $in: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
              },
            }
          },
          {
            $group: {
              _id: "$mainID",
              links: {
                $first: "$links"
              },
              // some more fields here
            }
          }
])

查询需要大约 3 到 5 秒来获取数据。然后我对链接数组进行一些额外的统计计算,例如根据值对字段进行一些计数。这需要几毫秒。 mainID 也被索引,这应该会加速第一个 $match。

我是 mongo 的新手,不知道如何继续。由于该功能仍处于试验阶段,因此我也愿意更改架构。不需要迁移,我仍然可以刷新所有数据并重新开始。

任何建议将不胜感激。

【问题讨论】:

  • 您能否发布一个更具体的示例,例如1)包含必要字段的文档示例,以及 2)实际上与文档示例对齐的聚合示例?不清楚$contentTestId是什么,为什么需要$first
  • 哦,我更改了键名,但显然不是全部。编辑了问题。我需要 $first 来获取我查询的每个 mainID 的最后插入的文档字段。我已经注意到,当我 $group 没有 .links 时,它的速度非常快。 .links 是一个大数组,因此我怀疑这只是一个获取问题。
  • 如果没有links 很快,也有可能是索引问题。您对收藏有哪些索引?您可以发布查询explain() 结果吗?更多信息在这里:docs.mongodb.com/manual/reference/explain-results 以及如何解释聚合查询:docs.mongodb.com/manual/reference/method/…(请参阅options 部分)
  • 我重写了整个查询,首先做组来获取我需要的文档的_id(mongo ids)($group->$first)。然后在另一个查询中,只需 .find 那些 _id(s)。 $group 阶段非常快, .find() (获取链接)再次变慢。我只有 _id 和 mainID 的索引。我有什么理由应该为我获取的字段提供链接吗?或者可能是因为服务器性能和链接大小(至少在获取的文档长度为 10,000)上很慢。
  • 感谢@KevinAdistambha 为我指明了正确的方向。单独缓存统计数据是我痛苦的答案。 .links 字段中的大数组是原因。

标签: mongodb


【解决方案1】:

经过一些基准测试并尝试了不同的方法来获得相同的结果,我终于发现问题不在于我如何获取数据,而在于我得到了什么。

一些文档的 .link 字段在一个数组中有 10K 个元素。将其中一个聚合起来就足以使整个查询变慢。

我坚信这是因为我的 mongo 实例的读取性能。

我通过更改存储这些数据的方式来修复它。现在,在将文档插入数据库之前,我从 .links 数组中计算出我真正需要的统计信息。

这样我可以在显示数据列表时只选择几个字段,并在真正需要时获取所有数据(单个文档视图)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2017-03-17
    • 2017-03-18
    • 2016-10-07
    • 2019-06-05
    • 2020-10-05
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多