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

相关推荐
我不会起名字32223 分钟前
消费回调固定 return nil:错误传播与 Kafka 位点提交的区别
后端·mongodb·kafka·go·im·故障排查
心仪久了会沦陷24 分钟前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方29 分钟前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
这个DBA有点耶1 小时前
MySQL 8.0不可见索引:删索引怕出事,不删又拖慢写入——中间态怎么用?
数据库·mysql·代码规范
悠仁さん2 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者2 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
测试界的小码农2 小时前
【图数据库实战进阶(01):从零认识 Neo4j,搭建第一个图数据库项目】
数据库·neo4j
x_SpiderMan3 小时前
搭建Oracle RAC 集群
数据库·oracle
测试界的小码农3 小时前
【图数据库实战进阶(03):Neo4j 图数据建模实战——节点、关系与属性应该怎么设计?】
数据库·oracle·neo4j
瑞克-桑切斯3 小时前
redis
数据库·redis·缓存