1. 过滤 + 限制(最基础)
| 操作符 | 用途 | 类似 SQL |
|---|---|---|
$match |
过滤文档,只保留符合条件的 | WHERE |
$limit |
只取前 N 条 | LIMIT N |
$skip |
跳过前 N 条 | OFFSET N |
$sample |
随机抽样 N 条 | - |
2. 排序
| 操作符 | 用途 | 类似 SQL |
|---|---|---|
$sort |
排序,1 升序,-1 降序 |
ORDER BY |
3. 字段处理(投影)
| 操作符 | 用途 | 类似 SQL |
|---|---|---|
$project |
选择/重命名/计算字段 | SELECT |
$addFields |
新增字段(保留原字段) | - |
$unset |
删除字段 | - |
$replaceRoot |
用指定字段替换整条文档 | - |
4. 分组统计(最核心)
| 操作符 | 用途 | 类似 SQL |
|---|---|---|
$group |
按字段分组,聚合计算 | GROUP BY |
$bucket |
按范围分桶(如年龄分段) | - |
$facet |
一次聚合出多个维度结果 | - |
$count |
计数 | COUNT(*) |
$group 内置聚合函数:
| 函数 | 用途 | 类似 SQL |
|---|---|---|
$sum |
求和 | SUM() |
$avg |
平均值 | AVG() |
$min / $max |
最小/最大值 | MIN() / MAX() |
$first / $last |
取第一个/最后一个值 | - |
$push |
聚合成数组 | GROUP_CONCAT() |
$addToSet |
聚合成不重复数组 | - |
5. 联表
| 操作符 | 用途 | 类似 SQL |
|---|---|---|
$lookup |
左连接(最常用) | LEFT JOIN |
$graphLookup |
递归查询(图/树结构) | WITH RECURSIVE |
$unionWith |
合并两个管道结果 | UNION |
6. 数组处理
| 操作符 | 用途 |
|---|---|
$unwind |
展开数组,每个元素变一条文档 |
$arrayElemAt |
取数组第 N 个元素 |
$slice |
数组切片(取前 N 个) |
$size |
数组长度 |
$filter |
过滤数组元素 |
$map |
数组映射转换 |
$reduce |
数组归约(累加) |
7. 条件判断
| 操作符 | 用途 | 类似 |
|---|---|---|
$cond |
if-else | CASE WHEN |
$switch |
多条件分支 | CASE WHEN ... ELSE |
$ifNull |
空值替换 | COALESCE() |
8. 字符串 / 日期处理
| 操作符 | 用途 |
|---|---|
$concat |
拼接字符串 |
$substr / $substrBytes |
截取字符串 |
$toUpper / $toLower |
大小写转换 |
$trim |
去空格 |
$split |
字符串拆分数组 |
$dateToString |
日期转字符串 |
$dateDiff |
日期差值 |
$add / $subtract |
日期加减 |
9. 输出
| 操作符 | 用途 |
|---|---|
$out |
结果写入新集合(覆盖) |
$merge |
结果合并到已有集合 |
$geoNear |
地理位置查询 |
实际组合示例
python
pipeline = [
{"$match": {"status": "active"}}, # 过滤
{"$sort": {"created_at": -1}}, # 排序
{"$skip": 0}, # 跳过 0 条
{"$limit": 10}, # 取 10 条
{"$lookup": { # 联表
"from": "orders",
"localField": "_id",
"foreignField": "user_id",
"as": "orders"
}},
{"$unwind": "$orders"}, # 展开数组
{"$group": { # 分组统计
"_id": "$city",
"total": {"$sum": "$amount"},
"count": {"$sum": 1}
}},
{"$sort": {"total": -1}}, # 再排序
{"$project": { # 投影
"city": "$_id",
"total": 1,
"_id": 0
}},
]
记忆优先级
| 优先级 | 必须掌握 |
|---|---|
| ⭐⭐⭐ | $match $sort $limit $project $group $lookup |
| ⭐⭐ | $unwind $addFields $cond $count |
| ⭐ | $bucket $facet $sample $out $merge |
80% 的场景用前 6 个就够了。