MongoDB如何每次仅获取10条文档实现点击分页查询?
MongoDB实现点击分页加载(每次10条)方案
你当前的全量查询代码如下:
const result = student.find();
要实现点击按钮每次加载10条、下次加载后续10条的效果,优先推荐基于有序字段的游标分页,性能稳定,不会随着数据量增大变慢,也不会因为数据增删出现漏查、重复查的问题,具体实现步骤:
- 选一个有序、唯一的字段作为分页标记,直接用MongoDB自带的
_id字段就可以,它自带唯一索引、和插入顺序绑定,不需要额外建索引。 - 前端维护两个状态:一个是固定每页条数
pageSize = 10,另一个是lastId,用来存上一次查询返回的最后一条数据的_id,初始值为null。 - 每次点击加载按钮时,前端把当前存的
lastId传给后端,后端根据这个值查询下一批数据,返回给前端后,前端把lastId更新为本次返回结果最后一条的_id;如果某次返回的结果条数小于10,说明已经到最后一页,直接隐藏加载按钮即可。
具体代码实现
第一次加载(无lastId场景)
const pageSize = 10; // 按_id倒序取最新的10条,要按插入正序排列就把sort里的-1改成1 const firstPageData = await student.find() .sort({ _id: -1 }) .limit(pageSize); // 返回给前端,前端记录最后一条的_id作为下次请求的lastId
后续加载更多(传lastId场景)
const pageSize = 10; // 从前端请求参数中拿到上一次返回的最后一条数据的_id,根据自己的接口传参规则,也可以从query、body中取值 const { lastId } = req.params; const nextPageData = await student.find({ // 倒序场景下,找_id比lastId小的下一批数据;如果是正序排列就把$lt改成$gt _id: { $lt: lastId } }) .sort({ _id: -1 }) .limit(pageSize); // 返回给前端,前端更新lastId为本次结果最后一条的_id
其他可选方案(仅适合小数据量场景)
如果你的student集合数据量在千条以内,也可以用skip + limit的简单写法,前端维护一个页码变量page,初始值为0,每次点击加载后page自增1即可:
const pageSize = 10; const page = 0; // 每次点击加载后值+1 const pageData = await student.find() .sort({ _id: -1 }) .skip(page * pageSize) .limit(pageSize);
注意:这个方案不适合大数据量场景,skip方法会遍历所有被跳过的文档,页数越大查询速度越慢,还可能因为查询间隔内数据增删,出现重复加载或者漏加载数据的问题。
内容的提问来源于stack exchange,提问作者SIDDHARTH SINGH
相关产品推荐
相关产品推荐

