缓慢聚合 - mongodb

时间:2017-07-24 20:37:36

标签: mongodb

我有一个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 个答案:

答案 0 :(得分:0)

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

有些文件' .link字段在数组中有10K个元素。只有其中一个聚合才能使整个查询变慢。

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

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

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

相关问题