Mongodb Mongo分页

Mongodb Mongo分页,mongodb,sorting,pagination,morphia,Mongodb,Sorting,Pagination,Morphia,我有一个用例,需要根据查询从mongo获取对象列表。但是,为了提高性能,我添加了分页。 所以,对于第一个调用,我得到了10个对象的列表,接下来我还需要10个。但我不能直接使用偏移量和页面大小,因为页面上显示的前10个对象可能已被修改[删除] 解决方案是找到传递的最后一个对象的对象Id,并在该对象Id之后检索接下来的10个对象 请帮助如何有效地使用Morphia mongo 使用morphia,您可以通过以下命令执行此操作 datastore.find(YourClass.class).field

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

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


请帮助如何有效地使用Morphia mongo

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

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

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

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

使用像这样的范围查询需要使用不同类型的接口,因为现在很难准确地检测您所在的页面以及将来存在的页面数量,特别是如果您这样做是为了避免传统分页的问题

这种分页方式产生的默认界面类型仅仅是一个无限滚动的页面,想想YouTube视频评论、Facebook wall feed甚至Google+。没有物理分页或“页面”,而是有一个“获取更多”按钮

这是您需要使用的接口类型,以使远程分页更好地工作

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

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

除了它应该大于(lastId)之外,因为您希望查找最后一个
\u id
之上的所有内容。我也会按
\u id
排序,除非您在插入记录之前的某个时间做了OJBECTID,如果是这种情况,那么您可以使用在insert上设置的特定时间戳来代替。

您是否会忽略
删除=1
?是的,当然。但若我加载下10个对象,那个么第11个对象将丢失,用户可以查看。不是吗?这取决于你希望文档移动的频率。你是不是被这件事打死了呢?还是因为没有这样做会对用户产生有害的影响呢?这可能会发生变化。我可以在第1页上频繁删除。您可能应该添加一个
排序(字段)
,否则值的顺序无法保证。您的意思是基于对象id排序吗?@cubbuk:您是否假设,对象id已排序?我不确定mongo对象(自动生成)是否已排序。一种方法是将tstamp添加到您的记录中,并根据它进行排序。您可以使用objectId本身的时间戳。通过这种方式,您将确保以插入顺序检索项目。或者最好使用一个全向递增的id。