【问题标题】:Mongodb LookUp Poor PerformanceMongodb LookUp 性能不佳
【发布时间】:2021-09-15 17:31:02
【问题描述】:
var product = db.GetCollection<Product>("Product");
var lookup1 = new BsonDocument(
    "$lookup", 
    new BsonDocument { 
        { "from", "Variant" }, 
        { "localField", "Maincode" }, 
        { "foreignField", "Maincode" }, 
        { "as", "variants" } 
    }
);
var pipeline = new[] { lookup1};
var result = product.Aggregate<Product>(pipeline).ToList();

集合 a 的数据非常大,所以我需要 30 秒才能将数据放入列表中。 我应该怎么做才能更快地查找?

【问题讨论】:

  • 您是否尝试为“Maincode”字段创建索引?
  • 我确实在 mongodb 中为 maincode 创建了一个索引,但我无法查找。
  • 如果索引本地字段没有太大帮助,如果您不需要一堆数据,则可以使用“分片集合”或分页进行查询。
  • 你能告诉我一步一步怎么做吗?你能发布示例代码吗?

标签: mongodb


【解决方案1】:

该查询所做的是从Product 集合中检索每个文档,然后对于找到的每个文档,在Variant 集合中执行查找查询。如果Variant 集合中的Maincode 字段没有索引,它将读取每个文档的整个集合。

这意味着如果总共有 1000 个产品,总共有 3000 个变体(平均每个产品 3 个),则此查询将读取来自 Product 的所有 1000 个文档,并且如果该索引不存在,它将从Variant 读取所有 3000 个文档 1000 次,即它将检查 300 万个文档。

一些可能加快速度的方法:

  • Variant 集合中的{Maincode:1} 上创建索引 这将减少为完成查找而必须读取的文档数量
  • 更改架构 如果变体与产品存储在同一文档中,则无需查找
  • 在查找之前过滤产品 同样,减少查找期间读取的文档
  • 使用游标批量检索文档 如果您首先执行任何必要的排序,最后查找,您可以将文档分批返回给应用程序,这将允许应用程序在第二批可用之前显示或开始处理第一批。这不会使查询本身更快,但可以减少应用程序中感知到的等待。

【讨论】:

  • 感谢您的回答,但我有问题。即使我使用索引,查找也需要 40 秒。我有 2000 个产品文档,10000 个变体文档。 Datatable 插入所有传入的数据。在使用索引之前,由于您的帮助,我花了更长的时间,但这也是很长的时间。
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 2021-04-25
  • 2020-01-25
  • 2016-10-08
  • 1970-01-01
  • 2018-02-06
  • 2016-02-25
  • 2022-01-05
相关资源
最近更新 更多