在 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 不在给定列表中的记录的查询时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章
Express / MongoDb 按 ID 查找所有对象并将它们保存到数组中
Express / MongoDb 按 ID 查找所有对象并将它们保存到数组中