跳到主要内容

分页

2025年03月01日
柏拉文
越努力,越幸运

一、认识


二、Skip + Limit


2.1 认识

Skip + Limit 思路: skip 跳过指定数量的数据, 可以用来跳过当前页之前的数据, 即跳过 pageSize*(n-1); limit, 指定从 MongoDB 中读取的记录条数,可以当做页面大小 pageSize该方案问题: 在数据量大时, 存在慢查询, skip+limit 分页方式在偏移量大时非常低效: 官方文档对 skip 的描述, skip 方法从结果集的开头进行扫描后返回查询结果。这样随着偏移的增加,skip 将变得更慢。所以,需要一种更快的方式。其实和 mysql 数量大之后不推荐用 limit m,n 一样。

2.2 实现

async function getList(ctx) {
const page = parseInt(ctx.query.page, 10) || 1;
const limit = parseInt(ctx.query.limit, 10) || 10;
const skip = (page - 1) * limit;

const [list, total] = await Promise.all([
PositionModel.find().skip(skip).limit(limit),
PositionModel.countDocuments(),
]);

if (list) {
ctx.body = {
code: 200,
data: {
list,
pageInfo: {
page,
limit,
total,
},
},
message: "查询成功!!",
};
return;
}

ctx.body = {
code: 200,
message: "查询失败!!",
};
}