我有以下代码段来运行聚合命令。
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 });
答案 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。