MongoDB 聚合框架

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 了解聚合框架的基本概念和使用场景

一、基本概念

(一)什么是聚合框架

聚合框架(Aggregation Framework)是用于在一个或几个集合上进行的一系列运 算从而得到期望的数据集的运算框架。


从效果而言,聚合框架相当于 SQL 查询中的:


  • GROUP BY
  • LEFT OUTER JOIN
  • AS
  • 但聚合框架的作用不限于此


(二)管道(Pipeline)和步骤(Stage)

管道(Pipeline):

  • 聚合框架对数据进行处理的过程。
  • 与 Linux 管道有类似之处;


步骤(Stage):

  • 步骤(Stage)是指管道中的一步操作。每个步骤:
  • 接受一系列文档(原始数据);
  • 在这些文档上进行一系列运算;
  • 生成下一个步骤所需的文档;

生成下一个步骤.png

聚合框架管道和步骤的示意,一个原始的数据集,有很多的数据,中间有对应的结果, 1 和 2 是每一个阶段执行的结果,最后处理作为最终的一个结果集返回给应用程序。


每一次的处理过程对应的一个处理的步骤,这些步骤按照顺序整合起来,就是聚合框架 的管道,从原始的数据集经过每一个步骤的处理,整个处理的方式和流程,就是 MongoDB 聚合框架。


二、基本使用

(一)使用形式

pipeline = [$stage1, $stage2, ...$stageN]; 
db.<COLLECTION>.aggregate( 
pipeline, 
{ options } 
);

聚合框架的基本使用,在 MongoDB 聚合框架里面最重要的一个参数就是 Pipeline, Pipeline 是一个数组的形式,在数组里面每一个元素表示一个对应的步骤,然后把整个 Pipeline 传给数据库进行执行,然后就按照这些步骤进行执行,最后把结果返回给客户端。


(二)常用步骤(stage)运算符 1

(二)常用步骤(stage)运算符 1.png

常用的 Stage 有$Match,进行过滤,类似于 SQL 里面的 WHERE 子句;$Project, 进行投影,类似于 SQL 里面的 AS;$Sort,会进行排序,类似于 ORDER BY;$Group 来 进行分组,类似于 SQL 里面的 GROUP BY;$Skip 和$Limit,进行翻页和查询的限制; $LookUp,类似于 SQL 里面左外连接。


(三)子运算符

(三)子运算符.png

在每一个步骤里面还包含很多的子运算符,在$Match 里面经常会用到了 EQ,表示某 个条件相等,$GT 大于$GTE 大于等于等; 还有$And/$All 这些逻辑运算符,还有表示地 理位置的,例如$Geowithin/$Intersect,表示地理位置运算的运算符,$Project 阶段步 骤,可能会用到$Map,$Reduce 来对数组的每个元素进行处理。


还有进行加减乘除的,例如$Multiply、$Divide、$Subtract、$Add 等;进行日期运 算的像$Year、$Month 等子的运算符,在$Group 里面经常进行聚合操作,例如子运算 符经常会用到$Sum 来进行汇总、$Avg 求平均值、$Push、$AddToSet 来对数组进行 操作。


(四)常用步骤(stage)运算符 2

(三)常用步骤(stage)运算符 2.png

还有其他的常用步骤运算符$Unwind 可以展开数组,例如在数组中有三个元素,到了 $Unwind 后就会展开成三个文档,形成三条记录。$GraphLookUp 可以进行图搜索, $Facet 和$Bucket,进行分面搜索。


(五)为什么只有左外连接?

(五)为什么只有左外连接?.png

MongoDB里面连接Join操作只有左外连接,因为Join这种操作上是违反MongoDB 设计的初衷的,这样操作经常要对两个表的不同数据进行连接操作,这些数据在物理存储的 时候,通常不是在相邻的区域里面,读取的效率比较低。


此外 MongoDB 是一个分布式的环境,校验操作的左右两边如果都是一个分片的表, 当进行 Join 操作的时候,左边有一个又有一条数据,它可能在分片一上要连接的一个数据 可能在分片二上,下一条数据可能又是另外一种情况,这种情况下数据库很难保证整个操作 的性能。


基于这些原因,MongoDB 只提供左外连接,并且要求 From 表不能是分片表,左边 的表主表可以是分片表,在 SQL 里面会使用类似于左边这样的一个查询语句。

查询语句。.png

(六)SQL 等价运算

(六)SQL 等价运算.png

在 SQL 里面还会使用 Group BY 类似于左边这样的一个运算符,对应的在 MongoDB 里面是使用聚合运算 Aggregate。


三、进阶使用

(一)$unwind

三、进阶使用.png

$Unwind 的操作符,这里有示例一条数据,Name 等于张三,张三的成绩放在 Score 这个数组里面,分别对应有三个元素,第一个是语文成绩,第二个是数学成绩,第 三个是外语成绩。


如果只使用$Unwind 的操作符,就会把这一个数据一条文档展开成三个文档,分别是 语文、数学和外语的成绩,进一步在$Unwind 的下面加一个$Sort 的操作符,按照姓名 Name 进行排序,在 Name 相同的情况下,按照 Score 进行降序。可以看到返回的第一 条结果就是张三并且是他科目当中成绩最高的,数学的得分在三科目当中最高,所以数学的 成绩会排在最前面。


(二)分面搜索

(二)分面搜索.png

还有常用的像分面搜索,例如逛一些论坛,或者是博客网站的时候,经常会看到帖子或 者是文章,会按照不同的地区,不同的内容板块,不同的类别,不同的标签来进行统计。


每一个内容板块对应到 MongoDB 里,可以把它认为一个是 Bucket。

Bucket.png

例一:

有很多的商品,我们希望按照商品的价格来进行分类统计,想按照价格在0~10之间,10~20之间,还有20~30,30~40以及大于40的,希望能够统计每一个区间里面商品的个数,对应可以用aggregation,然后使用$bucket这样的阶段操作符。

例一:.png

$Bucket 主要有这几个参数,第一个是 GroupBy,也就是要进行分组,使用$Price, 基于价格字段进行分组。


第二个参数是 Boundaries,在进行分组的时候,每个分割的区间有 00:00、2:00、3: 00、4:00 这几个分区的点,其他的放在 Default,它的值是 Other.


针对每一个分组的操作,要执行$Sum,求和的操作,返回的结果放在 Count 里面。


例二:

商品按照不同的价格区间来进行分组的同时还希望商品按照年份来进行分组。商品按照不同的价格区间来进行分组的同时还希望商品按照年份来进行分组。

例二:1.png

例二:2.png

在 MongoDB 里面,可以通过$Facet 查询操作来完成这样的统计,可先按照 Price 也就是价格进行一个$Bucket 的操作,此外除了 Price 之外,还按照年份进行另外一个的运 算。如果有其他的一个统计的需要,可以继续加在后面,通过一个$Facet 的操作,就可以 把商品按照不同的维度进行分类统计。


(三)图搜素

(三)图搜素.png

可以使用$GraphLookUp 操作符来进行图搜索。


四、视图

(一)视图的概念:

  • 基于一个或多个其他集合创建
  • 预定义聚合查询
  • 类似于 SQL 中的视图


作用:

  • 数据抽象 保护敏感数据的一种方法
  • 将敏感数据投影到视图之外
  • 只读
  • 结合基于角色的授权,可按角色访问信息

(二)创建视图

(二)创建视图.png

对于敏感数据,把数据的敏感字段放到视图之外,查询的结果里面就不会包含视图之外 的字段,视图还是只读的。结合上 MongoDB 里基于角色的权限授权,可以按角色去控制 数据的访问,保护这些敏感的数据,让没有获得授权的人通过访问视图不能够访问到敏感的 信息。


创建视图的命令对应的是 CreateView,其中包含的参数视图的名称和对应的聚合表 达式,这里使用的是$Project,排除_ID,保留 First_Name、Last_Name、Gender、 Email、Phone。


(三)删除

(三)删除.png

删除视图的话和删除一个集合是类似的,我们用“DB.+视图的名称+.Dorp()”就可以 删除视图。


快速掌握MongoDB核心技术目录

电子书下载:《玩转MongoDB从入门到实战》 https://developer.aliyun.com/article/780915
走进 MongoDB  https://developer.aliyun.com/article/781079
MongoDB聚合框架 https://developer.aliyun.com/article/781095
复制集使用及原理介绍  https://developer.aliyun.com/article/781137
分片集群使用及原理介绍  https://developer.aliyun.com/article/781104
ChangeStreams 使用及原理 https://developer.aliyun.com/article/781107
事务功能使用及原理介绍 https://developer.aliyun.com/article/781111
MongoDB最佳实践一 https://developer.aliyun.com/article/781139
MongoDB最佳实践二  https://developer.aliyun.com/article/781141
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1月前
|
SQL NoSQL Unix
MongoDB 聚合
10月更文挑战第17天
25 4
|
2月前
|
SQL NoSQL Unix
MongoDB聚合操作总结
这篇文章总结了MongoDB中聚合操作的作用、方法、常见聚合表达式以及聚合管道的概念和常用操作符,以及SQL与MongoDB聚合操作的对应关系。
42 2
MongoDB聚合操作总结
|
1月前
|
SQL NoSQL 数据处理
深入探索MongoDB的聚合操作
【10月更文挑战第13天】
15 0
|
2月前
|
NoSQL MongoDB 数据库
python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)
这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。
33 6
|
2月前
|
SQL NoSQL JavaScript
04 MongoDB各种查询操作 以及聚合操作总结
文章全面总结了MongoDB中的查询操作及聚合操作,包括基本查询、条件筛选、排序以及聚合管道的使用方法和实例。
86 0
|
3月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
87 1
|
3月前
|
NoSQL BI 数据处理
【超实用攻略】MongoDB 聚合框架:从入门到精通,带你解锁数据处理新姿势!
【8月更文挑战第24天】MongoDB是一款以其灵活性和高性能闻名的NoSQL数据库。其强大的聚合框架采用管道式处理,允许用户定义多个数据处理阶段如过滤、分组等。本文通过示例数据库`orders`和`products`,演示如何利用聚合框架计算各产品的总销售额。示例代码展示了使用`$lookup`连接两集合、`$unwind`打平数组及`$group`按产品ID分组并计算总销售额的过程。这突显了聚合框架处理复杂查询的强大能力,是进行数据分析和报表生成的理想选择。
54 3
|
3月前
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
71 2
|
3月前
|
存储 NoSQL 数据处理
【MongoDB大神级操作】揭秘聚合框架,让你的数据处理能力瞬间飙升,秒变数据界的超级英雄!
【8月更文挑战第24天】MongoDB是一款备受欢迎的非关系型数据库,以其灵活的文档模型和出色的可扩展性著称。其聚合框架尤其亮眼,能高效地对数据库中的数据执行复杂的转换与聚合操作,无需将数据导出到应用端处理,极大提升了数据处理的效率与灵活性。例如,在一个大型电商数据库中,聚合框架能轻松分析出最热卖的商品或特定时段内某类别商品的销售总额。通过一系列管道操作,如$unwind、$group等,可以对数据进行逐步处理并得到最终结果,同时还支持过滤、排序、分页等多种操作,极大地丰富了数据处理的能力,成为进行数据分析、报表生成及复杂业务逻辑实现的强大工具。
77 2
|
3月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
78 0

相关产品

  • 云数据库 MongoDB 版
  • 下一篇
    无影云桌面