【问题标题】:How can I effectively join 2 huge collections in MongoDb?如何有效地加入 MongoDb 中的 2 个大型集合?
【发布时间】:2012-09-15 11:00:27
【问题描述】:

我有两个巨大的(几十万条记录)集合 Col1Col2,我需要从它们中获取连接的数据。有一个连接条件可以让我将返回的记录数显着减少到几百个,所以在 SQL 语言中我会运行类似

 SELECT ... FROM Col1 INNER JOIN Col2 ON Col1.field1 = Col2.field2

它会运行得非常快,因为 Col1.field1Col2.field2 是索引字段。是否有任何直接的方法或解决方法可以在使用索引的 MongoDb 中快速执行相同的操作,而不是扫描所有项目?

注意:我无法重新设计集合以将它们合并为一个。

【问题讨论】:

  • 我们也有类似的情况。您是否找到了一种方法来提高 2 x 具有索引外键的集合之间的连接性能?

标签: mongodb


【解决方案1】:

MongoDB 没有 JOIN,因此没有快速的等价物。这很可能是架构设计问题,但您说您无法更改。您不能在一个查询中查询多个集合。

您可以在 2 个查询中执行连接客户端,也可以通过执行 map-reduce 并生成第三个集合以非实时方式执行此操作。

参考 this other question 了解如何做 map-reduce 的详细信息

【讨论】:

  • 您提到的两种方式都假设遍历至少一个集合的所有 50 万条记录,这是性能杀手,我需要在运行时而不是在后台某处进行。我不认为这是架构设计问题,而是所选数据库类型的问题,MongoDb 似乎不太适合我们的应用程序要求
  • 这就是我的意思。它是所选数据库的架构设计问题。理想情况下,您会将其存储在单个集合下。对于这个数据库来说,这不是一个有效的情况
  • 问题是,将这些信息存储到一个集合中可能会使数据库大小增加数百倍,因为有数百种方法可以连接这两个集合,将它们分开意味着数据非规范化,将它们合并在一起意味着数据库太大和许多重复的数据。即使我可以重新设计架构,我也不会这样做。所以我的结论是,MongoDb 并没有关系数据库那么灵活。无论如何感谢您的回复
  • @YMC 为什么你需要运行 50 万行的实时选择?哪个用户能够显示所有这些数据?我认为你需要重新考虑你在做什么。
【解决方案2】:

为了加入 MongoDb 4.2,您可以使用聚合和 $lookup,如下查询:

db.collection.aggregate([
   { $lookup: { from: "...", ... } }
])

对我有用

更多信息:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

【讨论】:

    【解决方案3】:

    MongoDB 中的join 太贵了。 2个解决方案:

    • 重新设计将它们合二为一
    • limit, match 加入前

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 1970-01-01
      • 2022-01-01
      • 2017-08-10
      • 2021-11-04
      • 2020-09-03
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多