MongoDB 分页查询
一、核心方法
db.集合名.find() // 查询
.skip(跳过条数) // 跳过前 n 条
.limit(每页条数) // 取 n 条二、分页公式
skip = (页码 - 1) * 每页条数三、示例
假设每页显示 3 条数据:
// 第 1 页
db.users.find().skip(0).limit(3)
// 第 2 页
db.users.find().skip(3).limit(3)
// 第 3 页
db.users.find().skip(6).limit(3)四、带条件的分页
// 查询 age 大于 18 的用户,取第 2 页,每页 3 条
db.users.find({ age: { $gt: 18 } }).skip(3).limit(3)五、配合排序
分页通常需要固定排序,否则每次查询结果顺序可能不一致:
db.users.find()
.sort({ age: 1 }) // 1 升序,-1 降序
.skip(0)
.limit(3)六、查询总条数
做分页时通常需要知道总页数:
db.users.countDocuments() // 总条数
db.users.countDocuments({ age: { $gt: 18 } }) // 带条件的总条数总页数计算:
总页数 = Math.ceil(总条数 / 每页条数)七、常见问题
Q:skip 数值很大时会有性能问题吗?
A:会。skip 需要扫描跳过的所有文档,数据量大时速度很慢。生产环境通常用上一页最后一条数据的 _id 作为条件来替代 skip,称为”游标分页”。
Q:不写 limit 会返回所有数据吗? A:默认返回全部,数据量大时要注意加 limit 避免查询过慢。