首页 / MongoDB 入门教程 / $sort、$limit、$skip 与 $count

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。