MongoDB范围查询分页的上一页

MongoDB范围查询分页的上一页,mongodb,pagination,Mongodb,Pagination,我收集了很多文章。由于集合非常大,我必须使用范围查询进行分页(而不是skip方法)。 为了直接使用_id上的范围查询获取(最新文章的)第一页: db.articles.find({}, {title:1}).limit(10).sort({_id:-1}) 为了再次翻开下一页,很简单: db.articles.find({"_id":{"$lt":ObjectId("43...75")}}, {title:1}).limit(10).sort({_id:-1}) (其中ObjectId是当前

我收集了很多文章。由于集合非常大,我必须使用范围查询进行分页(而不是skip方法)。
为了直接使用_id上的范围查询获取(最新文章的)第一页:

db.articles.find({}, {title:1}).limit(10).sort({_id:-1})
为了再次翻开下一页,很简单:

db.articles.find({"_id":{"$lt":ObjectId("43...75")}}, {title:1}).limit(10).sort({_id:-1})
(其中ObjectId是当前页面最后一篇文章的id)

问题来了:“我如何获得上一页?”

我的第一个想法是使用相同的查询,使用$gt而不是$lt和当前页面第一篇文章的_id。然而,这是错误的,因为如果当前页面包含第50-60条,那么上一页将是1-10条。
为了克服这个缺点,我可以使用sort({u id:1})进行排序并反转结果数组,但我觉得这就像是一个黑客

我是否遗漏了一些明显的东西??

提前感谢

使用排序分页,您可以记住上一页的最高条目,以便返回接下来的10个结果。例如,对以下集合进行分页

> for (var i = 0; i < 100; i++) db.page.insert({ "x" : i })

因此有一个映射
max\ux
=>
page
,即给定
max\ux
,您可以得到正确的页面,因为
max\ux
告诉您
x
的最小值不在页面上。因此,只要记住上一页的
max_x
(页面上文档的
x
下限),您就可以回忆起该页。

我用这种方法解决了它。如果您有更好的解决方案,请发表评论

// import ObjectId from mongodb
let sortOrder = -1;
let query = []
if (prev) {
    sortOrder = 1
    query.push({title: 'findTitle', _id:{$gt: ObjectId('_idValue')}})
}

if (next) {
    sortOrder = -1
    query.push({title: 'findTitle', _id:{$lt: ObjectId('_idValue')}})
}

db.collection.find(query).limit(10).sort({_id: sortOrder})

首先谢谢你的回复。如果我理解您的解决方案,您建议记住上一页中的值(例如在用户会话中)。但是,如果有人跟踪到第三个页面的链接(不是从前两个页面通过),该怎么办?我想,他只能转到下一页。在这种情况下,您是如何构造到第三页的链接而不经过前两页的?如果我将对象id传递到URL,则查询将获取对象id大于提供的的的文章。因此,获取对象id小于提供的id的文章:DSo您建议使用我在问题末尾描述的解决方案?如果您解释为什么选择这种方法,以及它相对于其他公认解决方案的优势,您的回答将对其他人更有帮助。
// import ObjectId from mongodb
let sortOrder = -1;
let query = []
if (prev) {
    sortOrder = 1
    query.push({title: 'findTitle', _id:{$gt: ObjectId('_idValue')}})
}

if (next) {
    sortOrder = -1
    query.push({title: 'findTitle', _id:{$lt: ObjectId('_idValue')}})
}

db.collection.find(query).limit(10).sort({_id: sortOrder})