【问题标题】:Mongo paginationMongo分页
【发布时间】:2013-01-13 10:39:11
【问题描述】:

我有一个用例,我需要根据查询从 mongo 获取对象列表。但是,为了提高性能,我添加了分页。 所以,对于第一次调用,我得到了 10 个对象的列表,接下来我需要 10 个。但是我不能直接使用offset和pageSize,因为页面上显示的前10个对象可能已经被修改了[deleted]。

解决方案是查找传递的最后一个对象的对象 ID,并检索该 ObjectId 之后的下 10 个对象。

请帮助如何使用 Morphia mongo 有效地做到这一点。

【问题讨论】:

  • 你不会直接省略 where deleted = 1 吗?
  • 是的,当然。但是如果我加载接下来的 10 个对象,则第 11 个对象将丢失供用户查看。不会吗?
  • 这取决于您希望文档移动的频率。您是否只是被 dong 杀死了,还是不这样做真的会对用户产生不利影响?
  • 将其视为我的项目集合的列表。这会发生变化。我可以在第 1 页时经常删除。

标签: mongodb sorting pagination morphia


【解决方案1】:

使用 morphia,您可以通过以下命令执行此操作。

datastore.find(YourClass.class).field(id).smallerThan(lastId).limit(10).order("-ts");

由于您是在最后一次检索到的 id 之后查询检索项目,因此您不会费心处理已删除的项目。

【讨论】:

  • 您可能应该添加一个sort(field),否则无法保证值的顺序
  • 你的意思是根据Object id排序吗?
  • @cubbuk:您是在假设,对象 ID 已排序?我不确定 mongo 对象(自动生成)是否已排序。
  • 嗯,一种方法是在您的记录中添加 tstamp 并根据它进行排序。您可以使用 objectId 本身的时间戳。这样,您将确保以插入顺序检索项目。或者更好的是只使用一个全方位递增的 id。
【解决方案2】:

我想到的一件事是,除非您打算更改界面的工作方式,否则您将遇到与在此处使用 skip() 相同的问题。

使用像这样的范围查询要求您使用不同类型的界面,因为现在必须更难准确地检测到您在哪个页面以及将来存在多少页面,特别是如果您这样做是为了避免出现问题常规分页。

从这种类型的分页中产生的默认界面类型仅仅是一个无限滚动的页面,想想 YouTube 视频 cmets 或 Facebook 墙提要甚至 Google+。没有物理分页或“页面”,而是有一个获取更多按钮。

这是您需要使用的界面类型才能使远程分页更好地工作。

至于查询@cubbuk 给出了一个很好的例子:

datastore.find(YourClass.class).field(id).smallerThan(lastId).limit(10).order("-ts");

除了应该是greaterThan(lastId),因为您想找到最后一个_id 之上的所有内容。我也会按 _id 排序,除非您在插入记录之前的某个时间创建 OjbectIds,如果是这种情况,那么您可以使用插入时设置的特定时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2018-07-04
    • 2022-01-27
    • 2020-04-29
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多