首页 > 解决方案 > Mongodb使用explain查找查询行为理解

问题描述

我在 MongoDB shell 版本:3.0.15

我一直在分析一个查询,但我不明白具体的行为

For:testcollection有两个key,“state”和“all”

db.testcollection.find( {"state" : 1}).explain(true) 

keysexamined和是正确的nreturned:2568 文档

但对于

db.testcollection.find( {"state" : 1}).limit(1000).explain(true)

nreturned变成101和_keysexamined 102

没有索引, acollscan被命中并101返回nreturned. 如果添加了正确的索引,它将命中此查询并且 ixscannreturned仍然完成101

根据我的理解以及https://docs.mongodb.com/v3.0/core/cursors/index.html的理解,如果它没有限制地返回我的默认文档计数,我不会感到惊讶101,但是在这里, with limit explain 显示nreturned 101限制后的文档而不是2568文档,当没有limit提供时,解释查询中nreturned101文档。

为什么限制会导致nreturned在解释查询中显示 101?

标签: mongodb

解决方案


我相信您所描述的与问题SERVER-24547 一致,其中指出:

如果未指定 batchSize(),Explain("allPlansExecution") 不支持 limit()

此问题影响 MongoDB 版本 3.0.12 及更高版本(在 3.0 系列中),并且根据SERVER-17577已在 MongoDB 的较新版本(即 3.2 和更高版本)中修复。

请注意,在撰写本文时,3.0.15 已经很老了,不再受支持。如果这是一个新部署,最好从 MongoDB 的更新版本(当前为 4.0.3)开始,这样您就不会被更高版本中修复的旧错误所困扰。


推荐阅读