limit(1).skip(1):为什么它返回第二个文件而不是什么?

时间:2016-01-03 03:06:34

标签: mongodb

我是mongodb的新手,请耐心等待。我用谷歌搜索了这个,但找不到令人信服的答案。 我理解以下内容应该限制结果中的n1个文档并跳过其中的n2个。

>db.mycol.find({},{"title":1}).limit(n1).skip(n2)

为什么以下查询会返回集合中的第二个文档?它应该什么都不返回? (限制一个给出第一个文件,跳过使我们什么都没有)。

>db.mycol.find({},{"title":1}).limit(1).skip(1)

3 个答案:

答案 0 :(得分:3)

limit放在skip之前,您想做什么?

如果您限制N元素,然后跳过K

这在逻辑上等同于跳过K并限制N-K

我认为优化器也知道这一点并且也期待你。

请参阅pipeline optimization

答案 1 :(得分:1)

  

我理解以下内容应限制结果中的n1个文档,并跳过的n2

不,你错了。以下是发生的事情:

  1. 您的查询由查询优化工具处理,查询优化工具将.sort().skip().limit()置于 完全 此订单< / LI>
  2. 通过利用索引或收集扫描来识别要返回的文件
  3. 现在根据.sort()子句的参数(如果存在)
  4. 对它们进行排序
  5. 根据.skip()子句的参数,跳过该排序文档列表的第一批文档。
  6. 现在,返回了许多等于.limit()子句参数的文档
  7. 实际上很容易证明:

    > db.bg.insert({a:1})
    WriteResult({ "nInserted" : 1 })
    > db.bg.insert({a:2})
    WriteResult({ "nInserted" : 1 })
    > db.bg.insert({a:3})
    WriteResult({ "nInserted" : 1 })
    > db.bg.insert({a:4})
    WriteResult({ "nInserted" : 1 })
    > db.bg.find()
    { "_id" : ObjectId("56889a8a32a39e5b2c96acb5"), "a" : 1 }
    { "_id" : ObjectId("56889a8d32a39e5b2c96acb6"), "a" : 2 }
    { "_id" : ObjectId("56889a9032a39e5b2c96acb7"), "a" : 3 }
    { "_id" : ObjectId("56889ad332a39e5b2c96acb8"), "a" : 4 }
    
    // According to your logic, this query would be empty
    // (Only one doc returned, and of that returned one skipped)
    // But it bears a result…
    > db.bg.find().sort({a:-1}).limit(1).skip(1)
    { "_id" : ObjectId("56889a9032a39e5b2c96acb7"), "a" : 3 }
    
    // …actually the same result when switching the place of the clauses
    > db.bg.find().sort({a:-1}).skip(1).limit(1)
    { "_id" : ObjectId("56889a9032a39e5b2c96acb7"), "a" : 3 }
    
    // Even when we put the sort clause to the end.
    // If the query optimizer would not have enforced the order mentioned
    // we would have natural order as in the default query,
    // then skip 1 (we would be at {a:2}),and limit to that document, making
    // the sort clause useless.
    // But, as you can see, it is the same result as before
    > db.bg.find().skip(1).limit(1).sort({a:-1})
    { "_id" : ObjectId("56889a9032a39e5b2c96acb7"), "a" : 3 }
    

答案 2 :(得分:0)

https://docs.mongodb.org/v3.0/reference/method/cursor.skip/

this.getMyQuestion = function(id, callback) {
    var query = connection.query('select * from questions where id = ' + connection.escape(id), function(err, result) {           
        callback(null, result[0].question);            
    });
}

this.getMyQuestion(1, function(err, question){
    // Do what you want
});

在查询结果时应用限制。

因此,在检索文档之前,查找所有匹配条件和Skip的文档,并检索限制中给出的文档数。