MongoDB Aggregation Pipeline 常用 Stage 速查

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 个就够了。

相关推荐
a11177627 分钟前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜30 分钟前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry44 分钟前
LeetCode 541. 反转字符串 II
算法
Jerry1 小时前
LeetCode 344. 反转字符串
算法
程序员在囧途1 小时前
likeadmin-api API 中转站怎么做统一报价?从 /pricing、/user/balance 到 task_id 回执的落地方法
运维·服务器·数据库·likeadmin-api·api中转站·token计费
搞科研的小刘选手1 小时前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议
Java小白笔记1 小时前
Codex config.toml配置实战指南
人工智能·算法·chatgpt·ai编程·集成学习
龙石数据2 小时前
MySQL 全量同步到 Hive 怎么做?三步配置教程
数据库·hive·mysql·数据治理·数据中台
王老师青少年编程2 小时前
2026年6月GESP真题及题解(C++七级):消消乐
数据结构·c++·算法·真题·gesp·2026年6月
z小猫不吃鱼2 小时前
模型剪枝经典论文精读:Pruning Filters for Efficient ConvNets
算法·机器学习·剪枝