想象一下当客户端提供具有限制10的对象时的情况 当需要接下来的10个时,它会发送跳过10并限制为10的请求。
但是,如果第一个请求偏移量== 0,则会有一些新对象被添加(或删除)到集合中。
然后在第二次请求(偏移== 10)时,响应可能有错误的对象顺序。
对它们的创建时间进行排序在这里不起作用,因为我有一些通过某些数字字段排序时形成的提要。
答案 0 :(得分:1)
这实际上取决于你想要的结果。
如果您希望原始对象按原始顺序而不管删除和添加操作,那么您需要复制列表(或至少订单),然后翻阅它。将每个Id复制到一个新的集合,该集合在页面加载后不会更改,然后通过该页面进行分页。
或者,也许更有可能的是,你想要的是看到当前集合中最后一个之后的10个,包括之后发生的任何删除或添加操作。为此,您可以使用您正在查看它们的排序顺序和过滤器,$ gt,无论最后一项是什么。但是当您要排序的字段中存在重复项时,这不起作用。为了解决这个问题,你需要在该字段上编制索引PLUS其他每个记录唯一的字段,例如_id字段。现在,您可以获取第一组中的最后一条记录,并查找$ eq为索引值的记录,$ gt,_id OR只是$ gt索引值。
答案 1 :(得分:1)
您可以添加一个时间字段,如created_at或updated_at。必须在创建或修改文档时更新,并且该字段必须是唯一的。
然后在此时间字段中使用$ gte和$ lte 以及排序在DB中查询时间范围。
这确保了在时间窗口之外进行的任何更改都不会反映在分页中,前提是时间字段没有重复项。最有可能的是,如果你包括microtime,重复不会发生。