我是mongodb的新手,请耐心等待。我用谷歌搜索了这个,但找不到令人信服的答案。 我理解以下内容应该限制结果中的n1个文档并跳过其中的n2个。
>db.mycol.find({},{"title":1}).limit(n1).skip(n2)
为什么以下查询会返回集合中的第二个文档?它应该什么都不返回? (限制一个给出第一个文件,跳过使我们什么都没有)。
>db.mycol.find({},{"title":1}).limit(1).skip(1)
答案 0 :(得分:3)
将limit
放在skip
之前,您想做什么?
如果您限制N
元素,然后跳过K
这在逻辑上等同于跳过K
并限制N-K
。
我认为优化器也知道这一点并且也期待你。
答案 1 :(得分:1)
我理解以下内容应限制结果中的n1个文档,并跳过的n2 。
不,你错了。以下是发生的事情:
.sort()
,.skip()
和.limit()
置于 完全 此订单< / LI>
.sort()
子句的参数(如果存在).skip()
子句的参数,跳过该排序文档列表的第一批文档。.limit()
子句参数的文档实际上很容易证明:
> 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的文档,并检索限制中给出的文档数。