我需要对一组文章进行分页(按日期排序 - 没有别的).在Mongodb中做这样的事情的标准方法是什么?
由于性能问题,我不打算使用skip()方法.我也不打算使用$ push方法.我见过的最接近的方法是范围查询方法.但是如果删除了任何已排序的项目,它似乎会失败.
范围排序应该适合您.第一个请求将按日期排序前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绑定.
基于范围的分页可以更好地使用索引,但不允许您轻松跳转到特定页面.
归档时间: |
|
查看次数: |
4488 次 |
最近记录: |