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