如何在Mongodb中实现分页?

Lul*_*lla 7 mongodb

我需要对一组文章进行分页(按日期排序 - 没有别的).在Mongodb中做这样的事情的标准方法是什么?

由于性能问题,我不打算使用skip()方法.我也不打算使用$ push方法.我见过的最接近的方法是范围查询方法.但是如果删除了任何已排序的项目,它似乎会失败.

And*_*ich 9

范围排序应该适合您.第一个请求将按日期排序前10个项目:

db.articles.find({}).sort( { date : -1 } ).limit(10);
Run Code Online (Sandbox Code Playgroud)

在此之后,您将需要存储最后一项的某个日期,并在下一个分页请求中使用id:

db.articles.find({"date": {$lt: storedDateOfLastItem}}).sort( { date : -1 } ).limit(10);
Run Code Online (Sandbox Code Playgroud)

所以,我想它应该适合你.要估算您需要使用计数的总页数.

但是如果删除了任何已排序的项目,它似乎会失败.

如果您要删除第1页中的文章,那么肯定会因为存储的最后日期而中断页面#2.为避免这种情况,您可以估算当前保存日期之前的项目数

db.articles.find({"date": {$gt: storedDateOfLastItem}}).sort( { date : -1 } ).count()
Run Code Online (Sandbox Code Playgroud)

如果这个计数被改变了(假设有2个被删除).你需要更新storedDateOfLastItem

db.articles.find({"date": {$gt: storedDateOfLastItem}}).sort( { date : -1 } ).take(2)
Run Code Online (Sandbox Code Playgroud)

再次从上面请求的最后一项获取storedDateOfLastItem并继续进行分页.

但我的意见只是保持这种分页,因为它没有额外的逻辑,因为我认为文章删除是罕见的操作.

来自mongodb文档:

分页成本不幸的是,跳过可能(非常)昂贵并且要求服务器从集合的开头或索引开始走到偏移/跳过位置,然后才能开始返回数据页面(限制).随着页面数量的增加,使用更大的集合,skip将变得更慢并且更加cpu密集,并且可能是IO绑定.

基于范围的分页可以更好地使用索引,但不允许您轻松跳转到特定页面.