MongoDB 聚合框架

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 了解聚合框架的基本概念和使用场景

一、基本概念

(一)什么是聚合框架

聚合框架(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
相关文章
|
8月前
|
SQL NoSQL 关系型数据库
MongoDB复杂分组聚合查询1
MongoDB复杂分组聚合查询1
420 0
|
1天前
|
NoSQL 数据挖掘 数据处理
【MongoDB 专栏】MongoDB 聚合管道:数据分析利器
【5月更文挑战第10天】MongoDB的聚合管道是数据分析利器,它通过一系列阶段(如\$match、\$group、\$project等)处理和转换数据,实现过滤、分组、统计等功能。适用于复杂的数据分析任务,能高效处理大量数据并提供实时洞察。在电商、日志和金融等领域有广泛应用。注意索引优化和避免过度聚合,以确保准确性和效率。借助聚合管道,我们可以深入挖掘数据价值,驱动业务发展。
【MongoDB 专栏】MongoDB 聚合管道:数据分析利器
|
11天前
|
NoSQL 大数据 数据处理
MongoDB聚合框架与复杂查询优化:技术深度解析
【4月更文挑战第30天】本文深入探讨了MongoDB的聚合框架和复杂查询优化技术。聚合框架包含$match、$group、$sort和$project阶段,用于数据处理和分析,提供灵活性和高性能。优化查询涉及创建合适索引、使用聚合框架、简化查询语句、限制返回结果数、避免跨分片查询、只查询所需字段及使用$inc操作符。理解这些技术有助于提升MongoDB在大数据和复杂查询场景下的性能。
|
1月前
|
JSON NoSQL MongoDB
mongodb导出聚合查询的数据
mongodb导出聚合查询的数据
|
1月前
|
NoSQL 数据挖掘 BI
【MongoDB】MongoDB 聚合框架
【4月更文挑战第3天】【MongoDB】MongoDB 聚合框架
|
4月前
|
存储 NoSQL MongoDB
MongoDB之索引和聚合
【1月更文挑战第21天】 一、索引 1、说明 2、原理 3、相关操作 3.1、创建索引 3.2、查看集合索引 3.3、查看集合索引大小 3.4、删除集合所有索引(不包含_id索引) 3.5、删除集合指定索引 4、复合索引 二、聚合 1、说明 2、使用
69 0
|
5月前
|
NoSQL MongoDB Docker
百度搜索:蓝易云【Scrapy框架之Docker安装MongoDB教程。】
现在,你已经成功在Scrapy框架中使用Docker安装并配置了MongoDB。你可以在Scrapy爬虫中使用MongoDB进行数据存储和处理。
221 0
|
6月前
|
SQL NoSQL Unix
13 MongoDB高级 - 聚合 aggregate
13 MongoDB高级 - 聚合 aggregate
37 0
|
8月前
|
分布式计算 JavaScript 前端开发
MongoDB复杂分组聚合查询3
MongoDB复杂分组聚合查询3
96 0
|
8月前
|
SQL NoSQL 关系型数据库
MongoDB复杂分组聚合查询2
MongoDB复杂分组聚合查询2
86 0

相关产品

  • 云数据库 MongoDB 版