共计 2872 个字符,预计需要花费 8 分钟才能阅读完成。
什么是聚合数据?
咱们先来看看是是聚合数据
数据聚合(Data Aggregation)是指 合并来自不同数据源的数据。.
聚类也称聚类分析,亦称为群集剖析,是对于统计数据分析的一门技术,
在许多畛域受到广泛应用,包含机器学习,数据挖掘,模式识别,图像剖析以及生物信息。
什么是聚合查问?
聚合操作解决数据是记录并返回计算结果的
局和操作组的值来自多个文档,能够对分组数据执行各种操作以范畴单个后果
聚合操作个别蕴含上面三类:
- 繁多作用聚合
- 聚合管道
- MapReduce
https://docs.mongodb.com/manu…
繁多作用聚合
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/manu…
聚合管道蕴含多个阶段,每个阶段在文件通过管道时进行转换,这里的管道,咱们能够了解成 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/manu…
例如 $count 的例子
第一个 $group
就用于筛选数据,聚合管道中,此处的输入是下一个管道的输出,下一个管道是 $project
抉择显示的字段
MapReduce
https://docs.mongodb.com/manu…
MapReduce 操作将大量的数据处理工作拆分成多个线程并行的解决,而后将后果合并在一起
MapReduce 具备如下 2 个阶段:
- 将具备雷同 key 的文档数据整合在一起的 map 阶段
- 组合 map 操作的后果进行统计输入的 reduce 阶段
能够看一个官网的例子
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/manu…
欢送点赞,关注,珍藏
敌人们,你的反对和激励,是我保持分享,提高质量的能源
好了,本次就到这里
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是 阿兵云原生,欢送点赞关注珍藏,下次见~