评估MongoDB聚合查询复杂性:$lookup的成本

5
我正在评估涉及一些MongoDB聚合查询的算法的计算成本,因此我尝试弄清楚我使用的各种操作符的成本,那么整个查询的成本将只是它们应用级联的总和。
我得出结论: $project、$match和$unwind的成本是O(n),其中n是集合中文档的数量,因为我没有任何索引,所以需要扫描所有文档。
现在我的问题是:新的$lookup运算符的成本如何?它在两个集合之间执行左连接,所以我的第一个猜测是它会计算两个集合的笛卡尔积,因此成本应该是O(n * m),其中m是第二个集合的大小。我是正确的吗?MongoDB是否做了更有效的处理?您有关于这个主题的任何参考资料吗?
1个回答

11

$lookup 实际上是针对被引用的集合进行 $in 查询,其中 $in 的值是要查找的管道中 localField 的值集合。

如果 foreignField 被索引,那么该查询的复杂度为 O(log(n))。如果没有索引,查询的复杂度为 O(n)。


在我的情况下,foreignField 没有被索引,所以相对于本地集合它是 O(n).. 但是外部集合呢?我们不应该也考虑它的大小吗? - cartoonheart91
相对于_foreign_集合,它是O(n)。将查询视为循环遍历整个_foreign_集合,并针对这些文档中的每个文档检查是否需要进行查找之一。 - JohnnyHK
啊啊啊!!好的!!哇,我预计性能会更差!谢谢!!:) :) - cartoonheart91

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接