mongodb 在查询期间如何处理文档

Posted

技术标签:

【中文标题】mongodb 在查询期间如何处理文档【英文标题】:how mongodb operates with documents during the query 【发布时间】:2013-11-05 10:16:40 【问题描述】:

这是一个非常具体的问题。

假设 - 我们有一个大型文档的集合,每个文档都有大量数据,而且我们没有额外的索引。

所以,当我像这样查询field_name: "test_value" 时,它只是从上到下查看所有文档,试图找到必要的字段然后检查它的值(如全文搜索),或者它可能有一些优化,例如使用一些元数据存储文档,或按字母顺序排列文档中的字段,或者可能是其他一些内部文档优化??? (如哈希表、一些索引等)

因为如果我们有 16mb 的原始文本数据,我们会想通过所有文档寻找必要的密钥 - 这可能会很耗时。

【问题讨论】:

如果你没有索引,那就是全扫描。您想要更快的查询 - 索引数据。 我不确定这一切都这么简单。认为一些优化仍然存在。例如 - 我尝试只保存测试文档,然后打印它。在结果文档中,某些字段的顺序略有不同。 欢迎大家阅读mongodb源码。 :) 这是一个很好的解决方案,有一天我一定会仔细研究关键部分。所以,对我来说主要问题不是阅读它,而是找到代码的哪一部分负责。 【参考方案1】:

如果您没有任何索引(除了您始终拥有的 _id 之外) - 这是没有优化的完整扫描(您称之为哈希表的优化,一些索引,一些元数据实际上是为加速而创建的索引向上查询)。可能是 16 Mb 不会像您想象的那么耗时,但是如果没有索引,它将遍历所有文档(除非您正在执行 findOne 或 limit 并且您很幸运并在一开始就获得了那些 1 个或几个元素)一个一个并尝试匹配一个模式。

因为人们对这个 O(n) 速度不满意,所以他们想出了索引的想法。

【讨论】:

以上是关于mongodb 在查询期间如何处理文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合(aggregate)常用操作及示例

mongo和mongod的区别

集腋成裘-14-MongoDB系列-01初识MongoDB

Mongodb 请求处理流程

MongoDB-3.4安装文档

如何拦截和记录 mongodb 查询? [复制]