mongo 进阶之——聚合管道

简介: 上面这句话的意思是,先用pumber来进行分组,会有两个字段,一个是"_id"和"count",在后一个管道中用1表示显示,0表示不显示

含义


管道是啥?大家都知道,用于承载物体流过的物品,如水管,气体管等连接起来的就是管道。在代码中我们可以理解成链式调用


js 中的管道


let arr = [1,2,3,4,5];
let res =arr.filter(a => a > 1).map(p => ({num: p}))
...
复制代码


上述代码的res的结果是: [{num: 2},{name: 3}, {name: 4}, {name: 5}],上面代码是数组arr经过了filter管道和map管道,最终产出一个结果res


mongo 管道


下面所有的案例都有一个这样的数据集合:


b6f80f587a33444554a50eb6e9680efc.png


aggregate


语法:db.collection.aggregate(pipeline,options);


1.group得基本用法: 语法: db.test.aggregate([{$group:{_id:'分组得key',test:{操作得事情}}}]);


列如:


  • 通过pumber分组,求每组得最小值


db.test.aggregate([{$group:{_id:'$pumber',total:{$min:"$quantity"}}}]);


52a4b12d7782b3a6fbb67e8fdcf17c49.png


  • 通过pumber分组,求每组的总和


db.test.aggregate([{$group:{_id:'$pumber',total:{$sum:"$quantity"}}]);


aba2af51c22360647eba3f51e7d74fef.png


  • 通过pumber分组,求每组的平均值


db.test.aggregate([{$group:{_id:'$pumber',average:{$avg:'$price'}}}]);


1bc1698c62fa703bf80a96507abdab5c.png


  • 通过pumber分组,把每个quantity,放入数组中


db.test.aggregate([{$group:{_id:"$pnumber",quantity:{$push:"$quantity"}}}]);


8a8fd5f28dd34637a2f09567b7cc80cf.png


  • 通过pnumber分组,把多个东西放入数组中


db.test.aggregate([{$group:{_id:"$pnumber",suit:{$push:{price:'$price',quantity:'$quantity'}}}}]);


be2f64cf3aaa37e2ef1e3abe4cc1aa37.png


pipeline 类型是Array  语法:db.collection.aggregate( [ { <stage> }, ... ] )


project


$project:可以对输入文档进行添加新字段或删除现有的字段,可以自定哪些字段显示与不显示。


  • 求总条数


db.test.aggregate([{$group:{_id:'$pumber',count:{$sum:1}}},{$project:{"_id":0,"count":1}}])


上面这句话的意思是,先用pumber来进行分组,会有两个字段,一个是"_id"和"count",在后一个管道中用1表示显示,0表示不显示


7e997f98e513193f1c9ddc7750245b54.png


match


$match用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作,相当于sql的where.


db.test.aggregate([{$match:{"pumber":'p001'}},{$group:{_id:'$pumber',count:{$sum:'$quantity'}}}]); 相当于sql select sum(quantity) as count from  test   where pnumber='p001'


f0d28cc44ad9d86cef75557e8103dff9.png


limit


$limit :用来限制MongoDB聚合管道返回的文档数 db.test.aggregate([{$match:{"pumber":'p001'}},{$limit: 1}])


模糊哈希pumber是p001,然后限制查询的条数


a52f10e610429ccb9164af7fb17db5fc.png


skip


$skip :在聚合管道中跳过指定数量的文档,并返回余下的文档。


  • 跳两个文件,然后查询限制1条:


db.test.aggregate([{ $skip: 2 },{ $limit: 1 }])


d3d12acb13c6fda4ea9be96044c91afd.png


  • 限制4条,然后跳过2个文件,得出2个文件


db.test.aggregate([{$limit:4},{$skip:2}]);


b240a065d3367014f97ab00a1aedeed1.png


注意: $limit、$skip、$sort、$match可以使用在阶段管道,如果使用在$group之前可以过滤掉一些数据,提高性能。


unwind


$unwind :将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。     //把查出来的对象数组,然后把数组的值取出来 db.test.aggregate([{$group:{_id:'$pnumber',array:{$push:'$quantity'}}},{$sort:{"pnumber":1}},{$unwind:"$array"}]);


de4bef418894f56b5064bee0e92eb670.png


sample


$sample :使用两种方法之一来获取 N 个随机文档,具体取决于集合的大小,N 的大小以及$sample在管道中的位置。


如果满足以下所有条件,则$sample使用伪随机游标选择文档:


  • $sample是管道的第一阶段
  • N 小于集合中文档总数的 5%
  • collections 包含 100 多个文档


如果不满足上述任何条件,则$sample执行收集扫描,然后进行随机排序以选择 N 个文档。在这种情况下,$sample阶段受排序内存限制约束。 语法:  $sample: { size: <positive integer> }


b66c7a2b22e870482afe910eb62650c3.png


每一次的结果都是不一样的


sort


$sort :将输入文档排序后输出。


7425ae1b287b9544970dfb3de8d0ed55.png


1是升序,-1是降序


out


$out :必须为pipeline最后一个阶段管道,因为是将最后计算结果写入到指定的collection中。如果集合不存在,,会自动创建一个新的集合,存在的话就覆盖. db.test.aggregate([{$group:{_id:"$pumber",sku:{$push:{price:"$price",quantity:"$quantity"}}}},{$out:"skus"}]);


dc5790516675fdedb2ba5b431e608664.png

相关文章
|
消息中间件 Kafka API
数据管道 Logstash 入门(上)
数据管道 Logstash 入门
117 0
|
7月前
|
NoSQL 数据挖掘 数据处理
深入浅出:MongoDB聚合管道的技术详解
深入浅出:MongoDB聚合管道的技术详解
|
7月前
|
存储 NoSQL 数据挖掘
深入探索MongoDB聚合操作:解析数据之美
深入探索MongoDB聚合操作:解析数据之美
227 1
|
NoSQL Cloud Native MongoDB
mongo 聚合操作
mongo 聚合操作
|
8月前
|
监控 安全
管道的三种使用方案中,唯一正确而安全的使用方法
管道的三种使用方案中,唯一正确而安全的使用方法
27 0
|
8月前
|
数据库 Python
Python-ElasticSearch客户端的封装(聚合查询、统计查询、全量数据)
Python-ElasticSearch客户端的封装(聚合查询、统计查询、全量数据)
141 0
|
机器学习/深度学习 分布式计算 NoSQL
【mongo 系列】mongodb 学习四,聚合知识点梳理
数据聚合(Data Aggregation)是指合并来自不同数据源的数据。. 聚类也称聚类分析,亦称为群集分析,是对于统计数据分析的一门技术, 在许多领域受到广泛应用,包括机器学习,数据挖掘,模式识别,图像分析以及生物信息。
326 4
|
消息中间件 存储 NoSQL
数据管道 Logstash 入门(下)
数据管道 Logstash 入门
105 0
|
数据库
mongo聚合操作命令
mongo聚合操作命令
95 0
mongo聚合操作命令
|
NoSQL JavaScript 前端开发
【mongo 系列】mongodb 学习五,聚合操作实操
在 users 里面准备一组数据,包含 item ,qty,status,tags 和 size 字段,其中 size 是内嵌文档,size 里面又包含了 h,w,uom 字段
116 0