如何在Mongodb中实现分页?

如何在Mongodb中实现分页?,mongodb,Mongodb,我需要对一组文章进行分页(按日期排序,而不是其他)。在Mongodb中这样做的标准方式是什么 由于性能问题,我不打算使用skip()方法。我也不打算使用$push方法。我见过的最接近的方法是范围查询方法。但是,如果删除任何已排序的项目,它似乎会失败。范围排序应该对您很有效。第一个请求将获取按日期排序的前10个项目: db.articles.find({}).sort( { date : -1 } ).limit(10); 在此之后,您需要将最后一项的日期存储在某处,并在下一个分页请求中使用id

我需要对一组文章进行分页(按日期排序,而不是其他)。在Mongodb中这样做的标准方式是什么


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

范围排序应该对您很有效。第一个请求将获取按日期排序的前10个项目:

db.articles.find({}).sort( { date : -1 } ).limit(10);
在此之后,您需要将最后一项的日期存储在某处,并在下一个分页请求中使用id:

db.articles.find({"date": {$lt: storedDateOfLastItem}}).sort( { date : -1 } ).limit(10);
所以,我想这对你来说应该很好。要估计您将需要使用的页面总数

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

例如,如果您要从第1页删除文章,请确保由于存储的最后日期而断开第2页。为了避免这种情况,您可以估计当前保存日期之前的项目数

db.articles.find({"date": {$gt: storedDateOfLastItem}}).sort( { date : -1 } ).count()
如果此计数已更改(假设删除了2个Article)。您需要更新
storedDateOfLastItem

db.articles.find({"date": {$gt: storedDateOfLastItem}}).sort( { date : -1 } ).take(2)
再次从上述请求的最后一项中获取storedDateOfLastItem,并继续进行分页

但我的观点是,保持页面的原样,不需要额外的逻辑,因为我认为删除文章是一种罕见的操作

来自mongodb文档:

不幸的是,skip的分页成本可能(非常)昂贵,并且需要 从集合或索引的开始遍历服务器以获取 到偏移/跳过位置,然后才能开始返回第页 数据(限制)。随着页码的增加,跳过速度将变慢,并且 更多的cpu密集型,可能是IO受限的,具有更大的集合

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


如果可以对索引进行排序,则可以使用“$min”和“$max”查询修饰符或范围查询实现高效分页。确保索引末尾包含唯一属性(例如“\u id”)


如果无法对索引进行排序,则可以预处理整个结果集,并按顺序保留“_id”值列表。然后,您可以获取该列表的一个范围,并使用“$in”查询运算符查找结果页面。

使用日期类型的范围查询/页面标记不起作用,因为对于相同日期的多个记录,将出现不一致。对此,我将使用_id值标记。所有这些都说明了这是一个大量的内务处理,只是为了避免跳过(N)的o(N)性能。啊,mongodb中的分页是如此乏味吗?我希望10gen的人能告诉我们他们是如何推荐分页的。@LulZilla:看看我的更新,它来自mongodb文档。你将
storedDateOfLastItem
存储在哪里?这太糟糕了。如何将用户跳转到任意页面?接受答案并关闭此问题