首页 > 解决方案 > Mongo DB 聚合 $lookup 向所有文档缓慢添加索引?

问题描述

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

我有两个收藏:

我正在使用$lookup(聚合)基于一个公共字段有效地对我的两个表进行连接,但与传统的 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();

标签: javascriptmongodb

解决方案


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

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


推荐阅读