如果mongodb聚合未将索引用于$ lookup,为什么使用索引时性能会提高?

时间:2019-04-11 03:52:24

标签: mongodb

我有以下代码段来运行聚合命令。

      console.time("something");
      const cursor = await db.collection("main").aggregate([
        {
          $match: {
            mainField: mainField,
          },
        },
        {
          $lookup: {
            from: "reference",
            localField: "referenceId",
            foreignField: "referenceField",
            as: "something",
          },
        },
      ]);
      const results = await cursor.toArray();
      console.timeEnd("something");

我有一个用于测试目的的廉价云服务器(2GB内存,1个CPU等),用于存储mongodb。

我将1万个文档插入到主集合和参考集合中(因此总共插入了2万个文档)。

不使用索引并运行上面的聚合查询,需要30秒钟以上才能返回结果。

如果我在参考集合上具有以下索引并运行上述聚合查询,则结果大约需要1.2秒。

await db.collection("reference").createIndex({ referenceField: 1 });

1 个答案:

答案 0 :(得分:1)

不幸的是,MongoDB手册当前并未提及$lookup的潜在索引用法,但确实是这种情况。

类似于您的示例的简单$lookup查询在另一个集合中的foreignField上执行相等匹配,因此您添加了正确的索引以提高性能(假设此字段也具有选择性)

在MongoDB 4.0上,aggregation explain output中未报告$lookup的索引使用情况。 MongoDB问题跟踪器中有一个相关的问题需要监视/更新:SERVER-22622: Improve $lookup explain to indicate query plan on the "from" collection