我有一个文章集合。因为集合非常大,我必须使用范围查询进行分页(而不是跳过方法) 为了在_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)
接下来的问题是:“我如何获得 PREVIOUS 页面???”
我的第一个想法是使用$ gt而不是$ lt和当前页面第一篇文章的_id使用相同的查询。然而这是错误的,因为如果当前页面有文章50-60,则前一页面将是1-10。
为了克服这个缺点,我可以使用sort({_ id:1})排序并反转结果数组,但我觉得它像一个黑客......
我错过了一些明显的东西吗? 提前致谢
答案 0 :(得分:0)
要对排序进行分页,您会记住上一页的最高条目,以便返回接下来的10个结果。例如,要对以下集合进行分页
> for (var i = 0; i < 100; i++) db.page.insert({ "x" : i })
您执行以下操作
> var page = db.page.find().sort({ "x" : 1 }).limit(10)
// do stuff with the page and get the highest `x`
> var max_x = page.toArray()[9].x
> var next_page = db.page.find({ "x" : { "$gt" : max_x } }).sort({ "x" : 1 }).limit(10)
所以有一个映射max_x
=&gt; page
,即max_x
,您可以获得正确的页面,因为max_x
告诉您x
的最小值不在页面上。所以请记住上一页的max_x
(页面上文档x
的下限),然后您就可以回想起该页面。
答案 1 :(得分:0)
我已经解决了这个问题。如果您有更好的解决方案,请发表评论。
python3