【问题标题】:Mongo DB aggregate $lookup slow add index to all documents?Mongodb 聚合 $lookup 缓慢为所有文档添加索引?
【发布时间】:2021-01-26 10:26:45
【问题描述】:

我的 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();

【问题讨论】:

    标签: javascript mongodb


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我添加了一些索引,从 25 秒到 700 毫秒
    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 2023-03-05
    • 2022-01-05
    • 1970-01-01
    • 2020-12-31
    • 2020-10-05
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多