Mongo DB 聚合 $lookup 缓慢向所有文档添加索引?

时间:2021-01-26 10:26:45

标签: javascript mongodb

我的 Mongo DB 数据库中有两个集合。总的来说,我对 Mongo DB 很陌生。我的每个集合都说现在有 1 个索引来自 Laravel 和 SQL 数据库,我可以通过在我的列迁移中添加带有 ->index() 的索引来提高性能,我假设有一种方法可以做类似的事情用于我的 Mongo DB 文档和键/值字段。

我有两个集合:

  • data_source_one(文档数量:5,300,文档总大小:1.2 MB)
  • data_source_two(文档数量:6,800,文档总大小:139.8 MB)

我正在使用 $lookup (aggregation) 基于一个公共字段有效地对我的两个表进行连接,但与传统的 SQL 数据库不同,它需要超过 25 秒才能完成请求。

我想知道如何通过将每个集合中所有文档的索引添加到我的 created_at 键(自定义)和其他字段来从本质上提高性能?

const client = new MongoClient(process.env.DB_CONNECTION)
await client.connect()

const results = await client.db().collection('data_source_one').aggregate([{
  $lookup: {
    from: 'data_source_two',
    localField: 'created_at',
    foreignField: 'created_at',
    as: 'combined_results'
  }
}]).toArray();

1 个答案:

答案 0 :(得分:2)

是的,您可以在特定字段上使用索引来实现更高效的执行。 MongoDB 使用索引来高效查询其集合。如果没有索引,MongoDB 必须执行集合扫描,即扫描集合中的每个文档,以选择那些与查询语句匹配的文档。如果查询存在合适的索引,MongoDB 可以使用该索引来限制它必须检查的文档数量。您可以查看文档 here

在您的情况下,如果您基于一个公共字段连接两个表,您可以向该字段添加索引以实现更快的执行。您可以查看有关优化聚合管道 here 的文档。但是,它可能仍然不如 SQL 中的 JOIN 语句快。

相关问题