为什么mongo在获取之前不应用限制和跳过

时间:2016-02-17 13:11:51

标签: mongodb

我在mongo db中编写了一个使用索引的查询(两者都用于查询作为排序部分)。如果我解释我得到的查询:

"cursor" : "BtreeCursor state_1_lastModified_-1",
"scanAndOrder" : false,
"indexOnly" : false,
"stats": 
"LIMIT" -> "SKIP" -> "FETCH" -> "IXSCAN"

为什么mongo在获取之前无法跳过并限制索引? 我知道我可以使用范围查询来避免使用限制和跳过。

2 个答案:

答案 0 :(得分:1)

如果索引完全满足您的过滤条件,那么查询计划器应该在 FETCH 之前跳过。这实际上是向 mongodb 人员报告的,他们已经在 https://jira.mongodb.org/browse/SERVER-13946 中解决了这个问题。该修复程序已向后移植。它出现在从 3.4.19 开始的 3.4.X、从 3.6.9 开始的 3.6.X、从 4.0.3 开始的 4.0 和从 4.1.2 开始的 4.1.X 中。也就是说,如果您在“3.6”发布分支上,那么您至少需要 3.6.9 才能看到更改。

答案 1 :(得分:0)

我认为这只是为了简单起见。

假设db.collection具有以下文档

{x: 1, y: 1}
{x: 2, y: 3}
{x: 3, y: 4}

<强> QUERY1

db.collection.find()。sort({x:1})。skip(1).limit(2)

阶段链可以是IXSCAN ==> SKIP ==> FETCH ==> LIMIT

<强> QUERY2

db.collection.find({x:2,y:3})。sort({x:1})。skip(1).limit(2)

阶段链必须为IXSCAN ==> FETCH ==> SKIP ==> LIMIT

为简单起见,所有案例都可以实现为IXSCAN ==> FETCH ==> SKIP ==> LIMIT