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 避免查询过慢。