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