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

相关文章
|
机器学习/深度学习 分布式计算 Cloud Native
【mongo 系列】聚合知识点梳理
【mongo 系列】聚合知识点梳理
|
消息中间件 Kafka API
数据管道 Logstash 入门(上)
数据管道 Logstash 入门
117 0
|
4月前
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
92 2
|
6月前
|
NoSQL 数据挖掘 数据处理
深入浅出:MongoDB聚合管道的技术详解
深入浅出:MongoDB聚合管道的技术详解
|
NoSQL Cloud Native MongoDB
mongo 聚合操作
mongo 聚合操作
|
7月前
|
监控 安全
管道的三种使用方案中,唯一正确而安全的使用方法
管道的三种使用方案中,唯一正确而安全的使用方法
25 0
|
消息中间件 存储 NoSQL
数据管道 Logstash 入门(下)
数据管道 Logstash 入门
105 0
|
数据库
mongo聚合操作命令
mongo聚合操作命令
93 0
mongo聚合操作命令
|
NoSQL JavaScript 前端开发
【mongo 系列】mongodb 学习五,聚合操作实操
在 users 里面准备一组数据,包含 item ,qty,status,tags 和 size 字段,其中 size 是内嵌文档,size 里面又包含了 h,w,uom 字段
114 0
|
SQL JSON Ubuntu
Elasticsearch聚合学习之一:基本操作
Elasticsearch的聚合是常用的功能,此三部曲系列通过实战来熟悉和了解常用的聚合命令和参数
204 0
Elasticsearch聚合学习之一:基本操作