【问题标题】:MongoDB - Paging with ranged queriesMongoDB - 使用范围查询进行分页
【发布时间】:2018-05-13 19:54:42
【问题描述】:

我目前正在使用 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。

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

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

【问题讨论】:

  • 你在运行什么样的负载?除非您的数据库有数百万条记录,否则您不会注意到性能问题。不要使事情过于复杂......只需使用find().skip().limit()。先让它工作,然后在你真正需要它时再优化它。

标签: javascript mongodb mongoose pagination


【解决方案1】:

评论是正确的,除非您知道您将拥有大量文档,否则您应该可以跳过。但是,即使您期望不高,但随后获得了巨大的成功/受欢迎,您也不希望您的代码被数百万用户使用而破坏。

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

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

【讨论】:

  • 感谢您的回复!这样就解决了不能按_id以外的东西排序的问题,太好了。但是,我仍然存在用户跳过多个页面的可能性的问题,即第 1 页上的用户直接进入第 7 页。在这种情况下,lastDate 和 lastId 的值不适合第 2 页,但不是第 7 页?
  • @calviners 分页不能这样完成,这更像是 facebook 的无限滚动。无论如何,如果您提供数百页,分页有点傻。与其提供数百页,不如提供更好的搜索选项。我经常使用谷歌,几乎不需要转到第 2 页。
猜你喜欢
  • 2011-07-28
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多