在 MongoDB 中,查找所有行 ID 不在给定列表中的记录的查询时间复杂度是多少?

Posted

技术标签:

【中文标题】在 MongoDB 中,查找所有行 ID 不在给定列表中的记录的查询时间复杂度是多少?【英文标题】:In MongoDB, what is the time complexity of a query to find all records with row ids not in a given list? 【发布时间】:2022-01-13 22:27:34 【问题描述】:

我有一个预定义的数组 A,其中包含特定表的任意数量的行 ID。

查询是查找该表的所有记录/行,其中行ID不包含在A中。

这个查询的时间复杂度是多少?

row id 是这个表的主键。这样就被索引了?

【问题讨论】:

最近我用$in 测试了一个聚合,它的复杂度是 O(m) m 个数组成员,所以我猜是 mxn (n records)(collection scan) 或 mxlogn (index scan) i我不确定那些。您可以测试它,也可以使用大列表或小列表,我认为大 => 更多时间,至少从我所做的测试来看。似乎 MongoDB 内部不使用集合,而是对数组进行串行搜索以查找是否包含。 【参考方案1】:

O(n)

直接取决于集合中的记录数量。

如果没有索引可以使用,O(n)。 如果可以使用索引,则索引是 b-tree。 所以它会是 O(log n)。

也可能存在边缘情况 - 但我认为以上内容涵盖了大多数情况。

如果您想获取有关查询/索引的一些有趣的详细信息 - 请查看说明 - 这是一种返回用于返回结果的查询/索引的有用详细信息的方法。

https://docs.mongodb.com/manual/indexes/

https://www.geeksforgeeks.org/introduction-of-b-tree-2/

【讨论】:

查询在记录 id 本身上。默认情况下,记录 id 不总是索引吗? @free_lions_n_tigers_from_cages 更新了答案。 为什么是log(n) 而不是m*log(n),其中m 是包含记录的数组的长度? @free_lions_n_tigers_from_cages - MongoDB 中的索引是 b 树。 B-Tree 从根开始生长和收缩。与其他平衡二叉搜索树一样,搜索、插入和删除的时间复杂度为 O(log n) docs.mongodb.com/manual/indexes

以上是关于在 MongoDB 中,查找所有行 ID 不在给定列表中的记录的查询时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中查找所有带有 * 的文档

Express / MongoDb 按 ID 查找所有对象并将它们保存到数组中

Express / MongoDb 按 ID 查找所有对象并将它们保存到数组中

查找三个表中的孤立行

SQLAlchemy:从另一个查询的结果中查找表中的所有匹配行

mongodb学习之:文档操作