用Mongo聚合计算返回文档中的唯一ID的速度很慢

时间:2018-06-27 19:47:03

标签: javascript node.js mongodb aggregation-framework

除了通过Mongo视图将经过过滤的文档集返回给最终用户外,我还运行了一些函数来生成运行总计。但是由于某种原因,尽管我的find()操作非常快(225毫秒),但我正在运行的此附加聚合要花6秒钟以上的时间才能完成,这会降低整个端点的速度,因为此数据是通过我回来了

我试图理解为什么这种聚合会这么慢?此聚合与最终用户传递的筛选器匹配,然后计算出现在返回的文档中的唯一客户ID的数量。看起来像这样:

  let totalCustomers = await db
    .collection("view_accounts_report")
    .aggregate([{
        $match: search
      },
      {
        $group: {
          _id: null,
          customers: {
            $addToSet: "$customer._id"
          }
        }
      },
      {
        $project: {
          uniqueCustomers: {
            $size: "$customers"
          }
        }
      }
    ])
    .next();

为什么要花6秒钟才能运行?有任何想法吗?关于如何加快速度的任何提示?

1 个答案:

答案 0 :(得分:1)

好吧,如果有很多不同的用户(或者通常有很多用户),那肯定要花一些时间。如果要检查,为什么要花费这么多时间,请尝试explain argument

另一方面,distinct 可能在这里是更好的选择:

let customers = await db.collection('view_accounts_report').distinct(search);
let totalCustomers = customers.length;