文章目录
- 《MongoDB实战入门》第5章 进阶查询:聚合管道与数据统计分析
- 5.2 常用聚合阶段实战
- 前置回顾:测试数据集结构
- 5.2.1 $match:筛选数据(管道的“前置过滤器”)
- 核心作用
- 语法格式
- 实战案例
- 关键注意事项
- 5.2.2 $project:字段投影与重命名
- 核心作用
- 语法格式
- 实战案例
- 关键注意事项
- 5.2.3 $group:分组统计(聚合计算核心)
- 核心作用
- 语法格式
- 实战案例
- `关键注意事项`
- 5.2.4 $sort:排序聚合结果
- 核心作用
- 语法格式
- 实战案例
- `关键注意事项`
- 5.2.5 $limit / $skip:聚合结果分页
- 核心作用
- 语法格式
- 实战案例
- 关键注意事项
- 5.2.6 综合实战:多阶段组合实现复杂统计
- 步骤拆解
- 实战代码
- 执行结果
- 5.2.7 核心总结
《MongoDB实战入门》第5章 进阶查询:聚合管道与数据统计分析
5.2 常用聚合阶段实战
- 聚合管道的核心价值在于通过不同阶段的组合实现复杂数据处理。
- 本节聚焦最常用的聚合阶段(
$match、$project、$group、$sort、$limit/$skip),结合电商订单场景拆解每个阶段的核心用法、语法要点与实战代码,所有案例均基于5.1节创建的orders集合。- 若未创建,需先执行5.1节的“前置准备:创建测试数据集”代码。
前置回顾:测试数据集结构
// 快速查看订单集合结构db.orders.findOne();5.2.1 $match:筛选数据(管道的“前置过滤器”)
核心作用
- 作为聚合管道的起始阶段(最优实践),筛选符合条件的文档,减少后续阶段需要处理的数据量,是聚合管道性能优化的关键。
- 其查询条件语法与
find()完全一致,但仅用于筛选文档(而非投影字段)。
语法格式
{$match:{<查询条件>}}实战案例
- 需求1:筛选“已支付”且订单金额大于1000元的订单
// 仅筛选,不做后续处理db.orders.aggregate([{$match:{status:"已支付",// 等值匹配amount:{$gt:1000}// 金额>1000}}]);- 需求2:筛选2025年1月2日创建的所有订单
db.orders.aggregate([{$match:{create_time:{$gte:ISODate("2025-01-02T00:00:00Z"),$lte:ISODate("2025-01-02T23:59:59Z")}}}]);关键注意事项
$match应尽可能放在管道起始位置,先过滤再计算;支持所有
find()的查询操作符($eq、$gt、$in、$and等),例如:{ $match: { category: { $in: ["电子产品", "服装"] } } }。
5.2.2 $project:字段投影与重命名
核心作用
控制文档的字段显示/隐藏、重命名字段、新增计算字段,重塑文档结构,是聚合管道中“调整输出格式”的核心阶段。
语法格式
{$project:{<字段1>:1/0,// 1=显示,0=隐藏(_id默认显示,需设为0隐藏)<新字段名>:"$原字段名",// 重命名字段<计算字段>:<表达式>// 新增基于原字段的计算字段}}实战案例
- 需求1:仅显示订单ID、商品分类、订单金额,并重命名
amount为订单金额,隐藏_id
db.orders.aggregate([{$match:{status:"已支付"}},// 先筛选{$pr