我如何才能有效地加入MongoDb中的2个大型集合?

我如何才能有效地加入MongoDb中的2个大型集合?,mongodb,Mongodb,我有两个巨大的(几十万条记录)集合Col1和Col2,我需要从这两个集合中获取连接的数据。有一个连接条件,可以让我将返回的记录数量大幅减少到几百条,所以在SQL语言中,我可以运行以下操作 SELECT ... FROM Col1 INNER JOIN Col2 ON Col1.field1 = Col2.field2 它会运行得非常快,因为Col1.field1和Col2.field2都是索引字段。在MongoDb中,有没有直接的方法或解决方法可以使用索引快速完成同样的事情,而不是扫描所有项

我有两个巨大的(几十万条记录)集合
Col1
Col2
,我需要从这两个集合中获取连接的数据。有一个连接条件,可以让我将返回的记录数量大幅减少到几百条,所以在SQL语言中,我可以运行以下操作

 SELECT ... FROM Col1 INNER JOIN Col2 ON Col1.field1 = Col2.field2
它会运行得非常快,因为
Col1.field1
Col2.field2
都是索引字段。在MongoDb中,有没有直接的方法或解决方法可以使用索引快速完成同样的事情,而不是扫描所有项目


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

MongoDB没有联接,因此没有fast等价物。这很可能是一个模式设计问题,但你说你不能改变它。不能在一个查询中查询多个集合

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


有关如何进行映射缩减的详细信息,请参阅。为了加入MongoDb 4.2,您可以使用聚合和$lookup,如下查询:

db.collection.aggregate([
   { $lookup: { from: "...", ... } }
])
这对我很有用


更多信息:

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