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

相关推荐
吃着火锅x唱着歌1 小时前
LeetCode 648.单词替换
算法·leetcode·职场和发展
一只积极向上的小咸鱼1 小时前
分词器tokenizer
算法·llm
Elsa️7461 小时前
leetcode 14.最长公共前缀
算法·leetcode·职场和发展
不会代码的小猴1 小时前
6. Qt网络编程
开发语言·c++·笔记·qt·算法
隔窗听雨眠1 小时前
MySQL索引机制深度解析:从B+树原理到高并发查询优化的完整指南
数据库·b树·mysql
数智化管理手记1 小时前
数据质量无法保障?自动化数据质量规则校验如何搭建方案?
大数据·数据库·自动化
Zguigo1 小时前
树的前序|中序|后序遍历【使用栈实现】
数据结构·算法
我的xiaodoujiao1 小时前
使用PyMySQL模块技术操作MySQL数据库
数据库·python·测试工具·mysql
zhanghaha13142 小时前
HTML系列教程:4_什么是 HTML 元素(零基础超详细讲解)
前端·算法·html
TAN-90°-2 小时前
Deep Learning for Computer Vision——Training CNNs and CNN Architectures
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉·cnn