基于MongoDB、Mongoose实现cursor pagination如何获取第二组数据
游标分页实现说明
不需要单独创建路由,你可以把两部分逻辑合并到同一个接口中,通过判断请求是否携带next游标参数执行对应逻辑即可,具体实现逻辑如下:
- 定义统一的列表请求接口,例如Express框架下可以定义为
GET /api/items - 接口逻辑中优先判断是否存在
req.query.next参数:- 未携带该参数时判定为请求第一页数据,执行你已经理解的第一部分查询逻辑
- 携带该参数时执行第二部分查询逻辑,过滤出
_id小于游标值的文档
- 返回数据前增加边界判断:如果返回的
items长度小于设置的分页条数,说明已经没有更多数据,将next设为null返回给前端,避免后续无效请求
完整代码示例
// 以Express + Mongoose为例,可适配你所用的后端框架 app.get('/api/items', async (req, res) => { const pageSize = 2; // 单页数据条数 const query = {}; // 存在游标参数时追加查询条件 if (req.query.next) { query._id = { $lt: req.query.next }; } // 统一执行查询 const items = await db.items.find(query).sort({ _id: -1 }).limit(pageSize); // 处理下一页游标 const next = items.length === pageSize ? items[items.length - 1]._id : null; res.json({ items, next }); })
注意:如果你后续调整了排序字段(比如改用创建时间
createdAt排序),需要保证排序字段是唯一且有序的,同时游标值需要对应调整为排序字段的值,避免出现分页漏数据、重复数据的问题。
内容的提问来源于stack exchange,提问作者HelpANoobOut
相关产品推荐
相关产品推荐

