当前位置: 首页 > news >正文

【mongo 系列】聚合知识点梳理

什么是聚合数据?

我们先来看看是是聚合数据

数据聚合(Data Aggregation)是指合并来自不同数据源的数据。.

聚类也称聚类分析,亦称为群集分析,是对于统计数据分析的一门技术,

在许多领域受到广泛应用,包括机器学习,数据挖掘,模式识别,图像分析以及生物信息。

什么是聚合查询?

聚合操作处理数据是记录并返回计算结果的

局和操作组的值来自多个文档,可以对分组数据执行各种操作以范围单个结果

聚合操作一般包含下面三类:

  • 单一作用聚合
  • 聚合管道
  • MapReduce

https://docs.mongodb.com/manual/aggregation/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kvQydOSd-1664114197748)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d22a79d1ba9c41e09a4a3dd8ad1b9590~tplv-k3u1fbpfcp-zoom-1.image)]

单一作用聚合

mongodb 自身提供如下几个单一作用的聚合函数,这些单一的聚合函数,相对聚合管道和mapReduce 来说不够灵活,也缺乏丰富的功能

  • db.集合名字.estimatedDocumentCount()

粗略的计算文档的个数,是一个估计值

  • db.集合名字.count()

计算文档的数量,是通过聚合来计算的

  • db.集合名字.distinct()

查看某一个字段都有哪些值

例如:

> db.users.find()
{ "_id" : ObjectId("61584aeeee74dfe04dac57e9"), "name" : "xiaokeai", "age" : 25, "hobby" : "reading", "infos" : { "tall" : 175, "height" : 62 }, "school" : "cs" }
{ "_id" : ObjectId("615a56d6bc6afecd2cff8f96"), "name" : "xiaozhu", "age" : 15, "hobby" : "basketball", "infos" : { "tall" : 190, "height" : 70 }, "school" : "sh" }
{ "_id" : ObjectId("615a5856d988690b07c69f64"), "name" : "xiaopang" }
{ "_id" : ObjectId("615a5917d988690b07c69f66"), "name" : "nancy", "age" : 25, "hobby" : "study", "infos" : { "tall" : 175, "height" : 60 }, "school" : "hn" }
{ "_id" : ObjectId("615a5917d988690b07c69f67"), "name" : "job", "age" : 19, "hobby" : "basketball", "infos" : { "tall" : 170, "height" : 70 }, "school" : "nj" }

> db.users.distinct("age")
[ 15, 19, 25 ]

上述例子,使用 db.users.distinct("age") 查看 age 字段存在的 value 有哪些

聚合管道

https://docs.mongodb.com/manual/core/aggregation-pipeline/

聚合管道包含多个阶段,每个阶段在文件通过管道时进行转换,这里的管道,我们可以理解成 linux 里面的管道,下一个指令的输入是上一个指令的输出

db.集合名.aggregate(<pipelines>,<options>)

  • pipelines

一组数据聚合阶段,除了 $out$Merge$geonear 在管道中只可以出现 1 次,其他的操作符每个阶段都可以在管道中出现多次

  • options

可选,聚合操作的其他参数

这里面包含了 查询计划,是否使用临时文件,游标,最大操作时间,读写策略,强制索引 等等

常用的管道聚合阶段

梳理一下常用的管道聚合阶段如下

阶段关键字描述
$match筛选条件
$group分组
$project显示字段
$lookup多表关联
$unwind展开数组
$out结果汇入新表
$count$文档计数
$sort$skip$limit排序和分页

其他的阶段我们查看官网 https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mbKu9t6I-1664114197749)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/39fac2008792476da100b3b22ce9564b~tplv-k3u1fbpfcp-zoom-1.image)]

例如 $count 的例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HRvkcvpQ-1664114197751)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3e21538a1e88431983c0066b07300923~tplv-k3u1fbpfcp-zoom-1.image)]

第一个 $group 就用于筛选数据,聚合管道中,此处的输出是下一个管道的输入,下一个管道是 $project 选择显示的字段

MapReduce

https://docs.mongodb.com/manual/core/map-reduce/

MapReduce 操作将大量的数据处理工作拆分成多个线程并行的处理,然后将结果合并在一起

MapReduce 具有如下 2 个阶段:

  • 将具有相同 key 的文档数据整合在一起的 map 阶段
  • 组合 map 操作的结果进行统计输出的 reduce 阶段

可以看一个官网的例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOLnYnbx-1664114197751)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f7352a3c6d6b49648da9c2d4a3399271~tplv-k3u1fbpfcp-zoom-1.image)]

emit 将 cust_id 和 amount 做成 map 映射,筛选条件是 status:"A",最后把结果放到一张新的集合中,命名为 order_totals

MapReduce 操作语法如下:

do.集合名.mapReduce(<map>,<reduce>,
{
  out:<collection>,query:<document>,
  sort:<document>,limit:<number>,
  finalize:<function>mscope:<document>,
  jsMode:<boolean>,verbose:<boolean>,
  bypassDocumentValidation:<boolean>
}
)
  • map

将数据拆分成键值对,交给 reduce 函数

  • reduce

根据键将值进行统计运算

  • out

可选,将结果汇入到指定表格中

  • query

可选参数,筛选数据的条件,结果是送入 map

  • sort

排序完成后,送入 map

  • limit

限制送入 map 的文档数

  • finalize

可选,修改 reduce 的结果后进行输出

  • scope

可选,指定 map ,reduce ,finalize 的全局变量

  • jsMode

可选,默认是 false, 在 mapreduce 的过程中是否将数据转换成 bson 格式

  • verbose

可选参数,是否在结果中显示时间,默认是 false 的

  • bypassDocumentValidation

可选参数,师傅略过数据校验的流程

聚合管道和 MapReduce 的对比

比较项聚合管道MapReduce
目的用于提高聚合任务的性能和可用性用于处理大数据集,数据巨大的时候,是用哪个 MapReduce 会更方便
特征可以根据需要重复管道运算符,管道操作不必为每个输入文档都生成一个输出文档除分组操作外,还可执行复杂的聚合任务以及对不断增长的数据集执行增量聚合
灵活性限于聚合管道支持的运算符和表达式自定义 map , reduce 以及 finalize javascript 函数提供了灵活性以及聚合逻辑
输出结果返回结果作为游标,如果管道包括一个 $out 或者 多个 $merge 阶段,则光标为空以各种选项 内联,新收集,合并,替换,缩小,返回结果
分片支持非分片和分片输入集合支持非分片和分片输入集合

再详细的对比,可以查看官网 https://docs.mongodb.com/manual/reference/map-reduce-to-aggregation-pipeline/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MfZY7vbU-1664114197752)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d42a7360cef047ab8d681e4cd4c623e9~tplv-k3u1fbpfcp-zoom-1.image)]

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtymBGRR-1664114197753)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d1fee735029248a0be6bb10f57167cdf~tplv-k3u1fbpfcp-zoom-1.image)]

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章:

  • 2022年9月26日--10月2日(ue4热更新视频教程为主)
  • 阿里云SLB负载均衡理论与操作
  • 【理论】(spark 二)spark core之RDD:基础概念、特点、stage任务划分与hello spark
  • JWT安全WebGoat实战与预编译CASE注入
  • 贝叶斯公式——假阳性问题
  • ES6-let-难点
  • 如何处理消费过程中的重复消息
  • 【reverse】虚假控制流入门:Ubuntu20.04安装ollvm4.0踩坑记+用IDApython去除BCF
  • 服装连锁店铺管理软件大盘点!秦丝、日进斗金、商陆花谁更强?
  • 编译原理6.1:NFA转DFA、DFA化简
  • 30分钟学完mysql的基本操作和语法(图文解说)
  • 基于JAVA中学网站设计与实现演示录像2020计算机毕业设计源码+系统+数据库+lw文档+部署
  • Oracle数据库中的集合(联合数组,嵌套表和可变数组)
  • 银行行测之百炼成钢
  • 昇思MindSpore安装教程
  • css的样式优先级
  • echarts花样作死的坑
  • gitlab-ci配置详解(一)
  • GraphQL学习过程应该是这样的
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Koa2 之文件上传下载
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SwizzleMethod 黑魔法
  • 复习Javascript专题(四):js中的深浅拷贝
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊flink的BlobWriter
  • 怎么将电脑中的声音录制成WAV格式
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • zabbix3.2监控linux磁盘IO
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (3)选择元素——(17)练习(Exercises)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (8)STL算法之替换
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Forward) Music Player: From UI Proposal to Code
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (七)Knockout 创建自定义绑定
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Family_物联网
  • .NET Core 2.1路线图
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net知识和学习方法系列(二十一)CLR-枚举
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [Angular 基础] - 数据绑定(databinding)
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [Google Guava] 1.1-使用和避免null
  • [HOW TO]如何在iPhone应用程序中发送邮件