MongoDB 入门教程
$sort、$limit、$skip 与 $count
本教程共 50 篇 · 第 31 篇 · 更新于 2026-07-30 · 约 6 分钟阅读
MongoDBMongoDB 入门教程sortlimitcount聚合分页
31. $sort、$limit、$skip 与 $count
本节目标:在聚合管道里用 $sort 排序、$limit 截断、$skip 跳过实现分页,并用 $count 阶段一步拿到文档总数,做出排行榜和计数报表。
聚合里的排序、分页和 find 同名方法思路一致,只是写成阶段。计数则多了一个专用的 $count 阶段。我们基于订单数据演示。
db.orders.insertMany([
{ _id: 1001, user_id: 1, status: "completed", total: 657 },
{ _id: 1002, user_id: 2, status: "completed", total: 1099 },
{ _id: 1003, user_id: 1, status: "shipped", total: 597 },
{ _id: 1004, user_id: 3, status: "pending", total: 528 },
{ _id: 1005, user_id: 2, status: "cancelled", total: 398 }
])
$sort:管道内排序
写法和 find 的 sort 一样,1 升序、-1 降序:
// 按 total 从大到小排
db.orders.aggregate([
{ $sort: { total: -1 } }
])
Note排序发生在它所在的位置。一般放在
$group之后,对汇总结果排;放在之前则是对原始文档排。
$limit 与 $skip:管道内分页
$limit 只留前 n 条,$skip 跳过前 n 条。两者组合就是分页:
// 先按金额降序,再取前 3 条(排行榜)
db.orders.aggregate([
{ $sort: { total: -1 } },
{ $limit: 3 }
])
// 跳过前 2 条,再取 2 条(第 2 页)
db.orders.aggregate([
{ $sort: { total: -1 } },
{ $skip: 2 },
{ $limit: 2 }
])
Warning分页一定要先
$sort再$skip/$limit。顺序反了,跳过的就不是你以为的那些文档。
实战:各用户总额排行榜前二
先按用户汇总,再排序,最后截断:
db.orders.aggregate([
{ $group: { _id: "$user_id", totalAmount: { $sum: "$total" } } },
{ $sort: { totalAmount: -1 } },
{ $limit: 2 }
])
这样得到「消费总额最高的两个用户」。
$count:计数阶段
$count 接收一个字段名,输出文档总数,省去自己写 $group + $sum:1:
// 统计已完成订单有多少条
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $count: "completedOrders" }
])
结果形如 { completedOrders: 2 }。
Tip想要「分组后再数每组有多少」,用
$group里的$sum: 1;想要「当前流水线剩多少条」,用$count最简洁。
阶段顺序建议
做报表时常见顺序是:$match(过滤)→ $group(汇总)→ $sort(排序)→ $skip+$limit(分页)→ $project(整形)。$count 通常放最后,统计最终条数。
| 阶段 | 作用 | 注意 |
|---|---|---|
$sort | 排序 | 放汇总后通常更合理 |
$limit | 截断前 n | 配合 $sort 做 TopN |
$skip | 跳过前 n | 分页用,先排后跳 |
$count | 计数 | 输出单条总数文档 |
下一章是聚合的「重武器」:$lookup 把两个集合关联起来,像 SQL 的 JOIN。