分页
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: "查询失败!!",
};
}