javascript - MongoDB - 使用范围查询进行分页

标签 javascript mongodb mongoose pagination

我目前正在使用 MongoDB 开发一个 Web 应用程序,它会用内容页面填充浏览器。

我知道两种分页方法(参见此处:https://scalegrid.io/blog/fast-paging-with-mongodb/):

1) .skip() + .limit()

2) .find({_id > last_id}).limit(n)

我了解第一个解决方案的性能问题,因此该选项不可行。

第二个解决方案效果很好,但前提是结果按 _id 排序。如果您按非唯一字段(例如日期)排序,则可能会有多个具有该日期的文档,因此某些文档可能会从结果中排除。

此外,用户必须线性浏览页面,因为有一个 last_id 变量需要不断更新,并且由最后一个文档的 _id 确定从上一页。如果用户从第 1 页跳转到第 7 页,第 7 页将显示第 2 页的结果,因为 last_id 将保存第 1 页最后一个文档的 _id .

所以我的问题是,如果我们按非唯一字段(例如日期或名字)排序,如何实现分页,以及如何允许用户一次跳转多个页面?

任何提示将不胜感激,谢谢!

最佳答案

评论是正确的,你应该可以跳过,除非你知道你将有很多文档。但是,即使您期望不高,但随后获得巨大成功/流行,您也不希望您的代码被破坏,只是因为它被数百万用户使用。

如果先按日期排序,然后按 ID 排序,您可以执行以下操作:

.find(
  {
    date:{
      $lte:lastDate
    },
    _id:{ 
      $lt: lastId 
    }
  }
).limit(n)

关于javascript - MongoDB - 使用范围查询进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564093/

相关文章:

javascript - "axios.defaults.headers.common[' Content-Type '] = ' application/json '"但 axios.post 仍然是 "application/x-www-form-urlencoded"

JavaScript 在数组中推送一个对象是什么——通过引用还是值?

javascript方法链接,从数组添加方法

javascript - Mongoose - 在对象中填充对象

javascript - 在集群模式下将 pm2 与 node.js 一起使用是否安全

javascript - 嵌入式 iframe/javascript 小部件的安全性

MongoDB 排序的地理边界框

javascript - Node.js 回调不执行

Azure 中的 MongoDB 副本集,我应该将防火墙指向哪里?

node.js - Mongoose 没有生活联系