常见操作
1.常见管道阶段
| 分类 | 运算符 | 作用 / 说明 | 常见场景 |
|---|---|---|---|
| 过滤 | $match | 按条件筛选文档,类似 find 的 query | 只要上架商品、只要本月数据 |
| 投影/加字段 | $project / $addFields / $set | 控制输出字段、重命名字段、增加计算字段 | 只返回必要字段、计算 finalPrice |
| 分组统计 | $group | 按 _id 分组并做聚合(求和、计数、均值等) | 按用户/按天统计金额、数量 |
| 排序/分页 | $sort / $skip / $limit | 排序、跳过 N 条、限制返回条数 | 列表页排序 + 分页 |
| 展开数组 | $unwind | 把数组里的每个元素“拆成多行” | 订单里的 items 一条一条展开 |
| 关联集合 | $lookup | 类似左连接,把另一集合的数据查出来放到数组字段里 | 订单关联用户信息 |
| 多路统计 | $facet | 一次遍历,同时走多条子管道,返回多个统计结果 | 一次请求返回多种统计面板 |
| 分组计数排序 | $sortByCount | 对某个字段分组计数并按数量排序,相当于 $group + $sort | 统计每个标签出现次数 |
| 计数 | $count | 统计当前管道流经文档总数,输出 { total: |
快速得到总数 |
一般常见使用顺序:原则:始终注意聚合管道的效率,确保限制文档数量。
1.匹配 $match | 相当于find,用来筛选符合条件的文档。
2.排序 $sort | 如果顺序很重要,一般会放在前面。
3.分页 $skip $limit | 表示从第几个开始,限制返回多少个。
4.投影 $project | 限制返回的字段。
例子:
1 | db.orders.aggregate([ |
2.常见聚合函数
(累加器,主要在 $group 中)
| 类型 | 运算符 | 说明 |
|---|---|---|
| 统计类 | $sum | 求和;$sum: 1 时等价于计数 |
| $avg | 求平均值 | |
| $min / $max | 组内最小值 / 最大值 | |
| $first / $last | 组内第一条 / 最后一条文档的字段值(依赖排序) | |
| 收集类 | $push | 把每个值放进数组(允许重复) |
| $addToSet | 把不重复的值放进数组(自动去重) |
3.常见表达式运算符
(在 $project / $addFields / $group 等里用)
| 分类 | 运算符示例 | 说明 / 用途 |
|---|---|---|
| 数学运算 | $add / $subtract / $multiply / $divide / $mod | 加减乘除、取余;如算含税价、差值等 |
| 字符串 | $concat | 拼接字符串(如 firstName + lastName) |
| $substr / $substrBytes / $substrCP | 截取字符串 | |
| $toUpper / $toLower | 大小写转换 | |
| 日期 | $year / $month / $dayOfMonth / $hour | 从日期中抽取年份、月份、日、小时等 |
| $dateToString | 格式化日期为字符串(如 YYYY-MM-DD) | |
| 条件判断 | $cond | if-else:condition ? then : else |
| $ifNull | 字段为 null/不存在时给默认值 | |
| $switch | 多分支条件判断 | |
| 数组相关 | $size | 数组长度 |
| $slice | 取数组前 N 个元素 | |
| $in | 判断某值是否在数组中 |