首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 认识文档数据库MongoDB
02 | MongoDB特色及优势
03 | 实验:安装MongoDB
04 | MongoDB基本操作
05 | 实验:Hello World程序开发
06 | 聚合查询
07 | 实验:聚合查询
08 | 复制集机制及原理
09 | 实验:搭建MongoDB复制集
10 | MongoDB全家桶
11 | 模型设计基础
12 | JSON文档模型设计特点
13 | 文档模型设计之一:基础设计
14 | 文档模型设计之二:工况细化
15 | 文档模型设计之三:模式套用
16 | 设计模式集锦
17 | 事务开发:写操作事务
18 | 事务开发:读操作事务之一
19 | 事务开发:读操作事务之二
20 | 事务开发:多文档事务
21 | Change Stream
22 | MongoDB开发最佳实践
23 | 分片集群机制及原理
24 | 分片集群设计
25 | 实验:分片集群搭建及扩容
26 | MongoDB监控最佳实践
27 | MongoDB备份与恢复
28 | 备份与恢复操作
29 | MongoDB安全架构
30 | MongoDB安全加固实践
31 | MongoDB索引机制(一)
32 | MongoDB索引机制(二)
33 | MongoDB读写性能机制
34 | 性能诊断工具
35 | 高级集群设计:两地三中心
36 | 实验:搭建两地三中心集群
37 | 高级集群设计:全球多写
38 | MongoDB上线及升级
39 | MongoDB应用场景及选型
40 | MongoDB典型案例(一)
41 | MongoDB典型案例(二)
42 | 关系型数据库迁移
43 | 数据库迁移方式及工具
44 | Oracle迁移实战
45 | MongoDB + Spark实时大数据
46 | MongoDB + Spark连接实战
47 | MongoDB SQL套接件
48 | MongoDB与微服务
49 | MongoDB与数据中台
50 | MongoDB数据中台案例
当前位置:
首页>>
技术小册>>
MongoDB入门到实战进阶
小册名称:MongoDB入门到实战进阶
### 07 | 实验:聚合查询 在MongoDB中,聚合查询是处理数据、执行复杂分析操作并生成汇总结果的重要工具。通过聚合管道(Aggregation Pipeline),MongoDB允许开发者将多个数据操作组合起来,以处理数据集合中的文档并返回计算结果。本章将深入探讨聚合查询的基本概念、聚合管道操作符的使用,并通过一系列实验来实践这些理论,帮助您从入门到实战进阶。 #### 一、聚合查询概述 聚合查询是MongoDB提供的一种强大的数据处理方式,它允许你对数据进行转换和组合,从而得到复杂的查询结果。与传统的查询不同,聚合操作可以在服务器端进行复杂的数据处理,减少了对客户端处理能力的依赖,提高了数据处理的效率和灵活性。 聚合管道是聚合查询的核心,它由一系列的阶段(Stage)组成,每个阶段接收输入数据,处理后将结果传递给下一个阶段,直到最后一个阶段输出结果。常见的聚合管道操作符包括`$match`、`$group`、`$sort`、`$project`、`$limit`和`$skip`等。 #### 二、聚合管道操作符详解 1. **$match**:用于过滤数据,只传递符合条件的文档到下一个阶段。它类似于find查询,但用于聚合管道中。 2. **$group**:将集合中的文档分组,可用于统计结果,如计算总数、平均值等。`$group`阶段通常与聚合操作符一起使用,如`$sum`、`$avg`、`$first`、`$last`等。 3. **$sort**:对所有输入文档进行排序,然后输出。排序可以在任何阶段进行,但通常在`$group`之前使用,以确保分组操作的顺序性。 4. **$project**:用于选择、添加或删除字段,还可以对字段进行重命名、计算等操作。它是控制聚合结果输出格式的重要工具。 5. **$limit**:限制聚合管道传递给下一个阶段的文档数。 6. **$skip**:跳过指定数量的文档,并传递剩余的文档给下一个阶段。 #### 三、实验:构建聚合查询 为了更好地理解聚合查询,我们将通过几个实验来实践不同的聚合管道操作。 ##### 实验一:统计订单数量 假设我们有一个名为`orders`的集合,包含多个订单文档,每个文档至少包含`customerId`(客户ID)和`totalAmount`(订单总额)两个字段。我们的目标是统计总订单数量。 ```javascript db.orders.aggregate([ { $group: { _id: null, totalOrders: { $sum: 1 } } } ]) ``` 在这个例子中,我们使用`$group`阶段对所有文档进行分组,因为不关心具体的分组条件(即所有订单作为一个整体),所以`_id`设为`null`。然后,我们使用`$sum`操作符对每个文档进行计数,累加得到总订单数量。 ##### 实验二:按客户统计订单总额 接下来,我们想要按客户统计每个客户的订单总额。 ```javascript db.orders.aggregate([ { $group: { _id: "$customerId", totalAmount: { $sum: "$totalAmount" } } } ]) ``` 在这个查询中,我们按`customerId`字段进行分组,并使用`$sum`操作符计算每个客户所有订单的总金额。 ##### 实验三:查询订单总额最高的前5名客户 现在,我们想要找出订单总额最高的前5名客户。 ```javascript db.orders.aggregate([ { $group: { _id: "$customerId", totalAmount: { $sum: "$totalAmount" } } }, { $sort: { totalAmount: -1 } }, { $limit: 5 } ]) ``` 首先,我们按`customerId`分组并计算每个客户的订单总额。然后,使用`$sort`阶段按`totalAmount`降序排序,最后通过`$limit`阶段限制输出结果为前5名。 ##### 实验四:计算每个商品类别的平均订单额 假设订单文档中还有一个`categoryId`字段表示商品类别。我们要计算每个商品类别的平均订单额。 ```javascript db.orders.aggregate([ { $group: { _id: "$categoryId", totalAmount: { $sum: "$totalAmount" }, totalOrders: { $sum: 1 } } }, { $project: { _id: 1, averageAmount: { $divide: ["$totalAmount", "$totalOrders"] } }} ]) ``` 在这个查询中,我们首先按`categoryId`分组,并计算每个类别的总订单额和订单数量。然后,在`$project`阶段,我们使用`$divide`操作符计算平均订单额。 #### 四、高级聚合技巧 - **使用$unwind操作符处理数组**:当文档中包含数组字段时,`$unwind`可以将数组中的每个元素拆分成独立的文档,便于后续处理。 - **多阶段组合实现复杂逻辑**:通过组合多个聚合管道阶段,可以实现复杂的数据处理逻辑,如嵌套分组、条件聚合等。 - **性能优化**:注意索引的使用,特别是在`$match`阶段中使用索引可以显著提高聚合查询的效率。同时,合理设计聚合管道,避免不必要的数据处理和排序操作。 #### 五、总结 通过本章的学习,您应该已经掌握了MongoDB聚合查询的基本概念、聚合管道操作符的使用方法,并能够通过实验实践这些理论。聚合查询是MongoDB中一个非常强大的功能,它允许开发者在服务器端进行复杂的数据处理和分析,为数据驱动的决策提供了有力的支持。希望本章的内容能够帮助您从MongoDB的入门阶段顺利过渡到实战进阶阶段。
上一篇:
06 | 聚合查询
下一篇:
08 | 复制集机制及原理
该分类下的相关小册推荐:
MongoDB面试指南
MongoDB入门与案例实战
MongoDB入门教程