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