MongoDB范围查询分页的上一页
我收集了很多文章。由于集合非常大,我必须使用范围查询进行分页(而不是skip方法)。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是当前
为了直接使用_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})