Mongo分页

时间:2013-01-29 18:47:43

标签: mongodb sorting pagination morphia

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

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

请使用Morphia mongo帮助您有效地使用它。

2 个答案:

答案 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,如果是这种情况,那么您可以使用在插入上设置的特定时间戳。