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

相关推荐
Shadow(⊙o⊙)20 分钟前
MySQL内置函数
数据库·mysql
笃行3501 小时前
金仓 KingbaseES PL/SQL 开发全攻略:异常处理、数据类型、调试优化与过程语句
数据库
快乐的木子李2 小时前
mysql-26.7.0-linux26.7.0下载安装
数据库·mysql
excel3 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
知行产研3 小时前
易控智驾:毛利率跃升17.2个百分点,矿山无人驾驶从“规模换增长“迈入“盈利拐点“
数据库·mysql
千里码aicood3 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
饺子大魔王的男人4 小时前
Redis 内存和连接异常怎么排查?用 redis_exporter 搭一套可远程抓取的监控链路
数据库·redis·bootstrap
可涵不会debug4 小时前
第一次学 LangGraph:用一个快递案例搞懂 State、Node、Edge 和 compile
服务器·数据库·mysql
做cv的小昊4 小时前
【World Model】π0.5:a Vision-Language-Action Model with Open-World Generalization
人工智能·算法·机器学习·大模型·多模态·vla·世界模型