我有一个用例,我需要根据查询从 mongo 获取对象列表。但是,为了提高性能,我添加了分页。所以,对于第一次调用,我得到了 10 个对象的列表,接下来我需要 10 个。但是我不能直接使用 offset 和 pageSize 因为页面上显示的前 10 个对象可能已被修改 [deleted]。
解决方案是查找传递的最后一个对象的对象 ID,并在该 ObjectId 之后检索接下来的 10 个对象。
请帮助如何使用 Morphia mongo 有效地做到这一点。
我有一个用例,我需要根据查询从 mongo 获取对象列表。但是,为了提高性能,我添加了分页。所以,对于第一次调用,我得到了 10 个对象的列表,接下来我需要 10 个。但是我不能直接使用 offset 和 pageSize 因为页面上显示的前 10 个对象可能已被修改 [deleted]。
解决方案是查找传递的最后一个对象的对象 ID,并在该 ObjectId 之后检索接下来的 10 个对象。
请帮助如何使用 Morphia mongo 有效地做到这一点。
使用 morphia 您可以通过以下命令执行此操作。
datastore.find(YourClass.class).field(id).smallerThan(lastId).limit(10).order("-ts");
由于您是在最后一次检索到的 id 之后查询检索项目,因此您不会费心处理已删除的项目。
我想到的一件事是,skip()
除非您打算更改界面的工作方式,否则您将遇到与使用此处相同的问题。
使用像这样的范围查询要求您使用不同类型的界面,因为现在必须更难准确地检测到您所在的页面以及将来存在多少页面,特别是如果您这样做是为了避免传统分页的问题。
这种类型的分页产生的默认界面类型仅仅是一个无限滚动的页面,想想 YouTube 视频评论或 Facebook 墙提要甚至 Google+。没有物理分页或“页面”,而是有一个获取更多按钮。
这是您需要使用的接口类型,以使远程寻呼更好地工作。
至于查询@cubbuk 给出了一个很好的例子:
datastore.find(YourClass.class).field(id).smallerThan(lastId).limit(10).order("-ts");
除了它应该是greaterThan(lastId)
因为你想找到最后的所有内容_id
。_id
除非您在插入记录之前的某个时间创建 OjbectIds ,否则我也会进行排序,如果是这种情况,那么您可以使用插入时设置的特定时间戳。