常见操作

1.常见管道阶段

分类 运算符 作用 / 说明 常见场景
过滤 $match 按条件筛选文档,类似 find 的 query 只要上架商品、只要本月数据
投影/加字段 $project / $addFields / $set 控制输出字段、重命名字段、增加计算字段 只返回必要字段、计算 finalPrice
分组统计 $group 按 _id 分组并做聚合(求和、计数、均值等) 按用户/按天统计金额、数量
排序/分页 $sort / $skip / $limit 排序、跳过 N 条、限制返回条数 列表页排序 + 分页
展开数组 $unwind 把数组里的每个元素“拆成多行” 订单里的 items 一条一条展开
关联集合 $lookup 类似左连接,把另一集合的数据查出来放到数组字段里 订单关联用户信息
多路统计 $facet 一次遍历,同时走多条子管道,返回多个统计结果 一次请求返回多种统计面板
分组计数排序 $sortByCount 对某个字段分组计数并按数量排序,相当于 $group + $sort 统计每个标签出现次数
计数 $count 统计当前管道流经文档总数,输出 { total: } 快速得到总数

一般常见使用顺序:原则:始终注意聚合管道的效率,确保限制文档数量。

1.匹配 $match | 相当于find,用来筛选符合条件的文档。

2.排序 $sort | 如果顺序很重要,一般会放在前面。

3.分页 $skip $limit | 表示从第几个开始,限制返回多少个。

4.投影 $project | 限制返回的字段。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
db.orders.aggregate([
// 只要本月订单
{
$match: {
createdAt: {
$gte: ISODate("2025-11-01T00:00:00Z"),
$lt: ISODate("2025-12-01T00:00:00Z")
}
}
},
// 按 userId 分组统计
{
$group: {
_id: "$userId",
orderCount: { $sum: 1 },
totalAmount: { $sum: "$amount" },
avgAmount: { $avg: "$amount" }
}
},
// 只要订单数 ≥ 3 的用户
{ $match: { orderCount: { $gte: 3 } } },
// 输出格式美化
{
$project: {
_id: 0,
userId: "$_id",
orderCount: 1,
totalAmount: 1,
avgAmount: 1
}
},
{ $sort: { totalAmount: -1 } }
])

2.常见聚合函数

(累加器,主要在 $group 中)

类型 运算符 说明
统计类 $sum 求和;$sum: 1 时等价于计数
$avg 求平均值
$min / $max 组内最小值 / 最大值
$first / $last 组内第一条 / 最后一条文档的字段值(依赖排序)
收集类 $push 把每个值放进数组(允许重复)
$addToSet 把不重复的值放进数组(自动去重)

3.常见表达式运算符

(在 $project / $addFields / $group 等里用)

分类 运算符示例 说明 / 用途
数学运算 $add / $subtract / $multiply / $divide / $mod 加减乘除、取余;如算含税价、差值等
字符串 $concat 拼接字符串(如 firstName + lastName)
$substr / $substrBytes / $substrCP 截取字符串
$toUpper / $toLower 大小写转换
日期 $year / $month / $dayOfMonth / $hour 从日期中抽取年份、月份、日、小时等
$dateToString 格式化日期为字符串(如 YYYY-MM-DD)
条件判断 $cond if-else:condition ? then : else
$ifNull 字段为 null/不存在时给默认值
$switch 多分支条件判断
数组相关 $size 数组长度
$slice 取数组前 N 个元素
$in 判断某值是否在数组中