分组:$group()

   db.集合.aggregate(
      {$group: {_id:'$分组字段名', 显示字段:{$统计函数: '$统计字段'}}},
    )
  1. -- 统计男生,女生各是多少
  2. db.stu.aggregate(
  3. {$group:{_id:'$gender', count:{$sum:1}}}
  4. )
将整个文档为一组, 指定 id 为 null
  1. --求学生的总人数和平均年龄
  2. db.stu.aggregate(
  3. {$group:{_id:null, count:{$sum:1}, avg_scroe:{$avg:'$age'}}}
  4. )

透视数据: $push统计函数

$push: 把不同内容,放入一个数组(列表)
使用: $$ROOT把这个文档内容加入到结果集中 
  1. -- 统计不同性别的学生姓名
  2. db.stu.aggregate(
  3. {$group:{_id:'$gender', name:{$push:'$name'}}}
  4. )

过滤:$match

用于过滤数据,只输出符合条件的才作为输出
与find的区别:$match可以把过滤后的文档,交给下一个管道,而find()不可以
过滤字段字段作为键, 直接写, 不能使用 '$字段名'的形式
  db.集合.aggregate(
      {$match:{json格式过滤条件}},
  )
  1. -- 查询年龄大于20的学生
  2. db.stu.aggregate(
  3. {$match:{age:{$gt:20}}}
  4. )
  5. --查询年龄大于20的男生与女生人数
  6. db.stu.aggregate(
  7. {$match:{age:{$gt:20}}},
  8. {$group:{_id:'$gender',counter:{$sum:1}}}
  9. )

修改文档结构: $project

修改输入文档结构, 添加字段,删除字段,重命名字段
  db.stu.aggregate(
    {$project:{_id:0, 字段名:1, 字段名: 1, 字段名: '$上一个结果集字段'}}
  )

  1. --查询 只显示学生的姓名,年龄
  2. db.stu.aggregate({$project:{_id:0, name:1, age:1}})
  3. --查询男生,女生人数, 只输出性别和人数
  4. db.stu.aggregate(
  5. {$group:{_id:'$gender', count:{$sum:1}}},
  6. {$project:{_id:0,gender:'$_id', count:1}}
  7. )

排序$sort()

将输入的文档排序后输出
1为升序, -1为降序
db.stu.aggregate(
  {$sort:{字段:1}}
)
  1. --查询学生信息, 按年龄升序排列
  2. db.stu.aggregate(
  3. {$sort:{age:1}}
  4. )
  5. -- 查询男生和女生人数, 按人数降序排
  6. db.stu.aggregate(
  7. {$group:{_id:'$gender', count:{$sum:1}}},
  8. {$project:{_id:0,gender:'$_id', count:1}},
  9. {$sort:{count:-1}}
  10. )

$skip&$limit

$skip: 跳过指定数量的的文档,并返回剩余文档
$limit: 限制聚合管道返回的文档数量
  1. --查询从第3条开始的学生信息
  2. --$limit: 限制聚合管道返回的文档数量
  3. db.stu.aggregate({$skip:2})

  4. --查询2条学生信息
  5. db.stu.aggregate({$limit:2})

  6. --统计男生,女生人数, 按人数升序, 取出第二条数据
  7. db.stu.aggregate(
  8. {$group:{_id:'$gender', count:{$sum:1}}},
  9. {$sort:{count:1}},
  10. {$skip:1},
  11. {$limit:1}
  12. )

$unwind

将⽂档中的某⼀个数组类型字段拆分成多条, 每条包含数组中的⼀个值
db.集合名称.aggregate({$unwind:'$字段名称'})
  1. db.t3.insert({_id:1,item:'t-shirt',size:['S','M','L']})
  2. --$unwind 将集合拆分
  3. db.t3.aggregate({$unwind:'$size'})
结果:
 
  1. { "_id" : 1, "item" : "t-shirt", "size" : "S" }
  2. { "_id" : 1, "item" : "t-shirt", "size" : "M" }
  3. { "_id" : 1, "item" : "t-shirt", "size" : "L" }
问题: 在使用$unwind的时候, 默认会丢弃属性值为空的文档.
如果希望保留,需要把设置 preserveNullAndEmptyArrays 为true
  db.集合名.aggregate([
    {$unwind:{
       path:'$字段名称'
       preserveNullAndEmptyArrays:true(保留)/false(丢弃)
    }

  ])

 

MongoDB-管道与聚合(3)的更多相关文章

  1. MongoDB学习笔记——聚合操作之聚合管道(Aggregation Pipeline)

    MongoDB聚合管道 使用聚合管道可以对集合中的文档进行变换和组合. 管道是由一个个功能节点组成的,这些节点用管道操作符来进行表示.聚合管道以一个集合中的所有文档作为开始,然后这些文档从一个操作节点 ...

  2. 在MongoDB中实现聚合函数

    在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加. ...

  3. mongodb与sql聚合对应图 M

    mongodb与sql聚合对应图 M - CSDN博客 http://blog.csdn.net/u011930016/article/details/49422425 SQL Terms, Func ...

  4. MongoDB第三天(正则,管道,聚合,字符串,算术,日期,java连接MongoDB)

    部分正则表达式: i:忽略大小写 m:多行查找 x:设置 x 选项后,正则表达式中的非转义的空白字符将被忽略.   s:允许点字符(即.)匹配包括换行符在内的所有字符. w:匹配包括下划线的任何单词字 ...

  5. MongoDB小结27 - 聚合管道【$project】

    我们有这样的数据 { "_id" : 1, title: "abcdef", isbn: "6969696969", author: { l ...

  6. Mongodb - 解决 ( aggregate聚合管道 ) $match 根据 id 匹配 返回 [ ] 的问题

    需要对 id 进行转换 const mongoose = require('mongoose') var ObjectId = mongoose.Types.ObjectId;   await Use ...

  7. MongoDB的学习--聚合

    最近要去的新项目使用mysql,趁着还没忘记,总结记录以下MongoDB的聚合. 聚合是泛指各种可以处理批量记录并返回计算结果的操作.MongoDB提供了丰富的聚合操作,用于对数据集执行计算操作.在  ...

  8. MongoDB的aggregate聚合

    聚合框架中常用的几个操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档.(显示的列,相当遇sql 的) $match:用于过滤数据,只输出符 ...

  9. MongoDB中的聚合操作

    根据MongoDB的文档描述,在MongoDB的聚合操作中,有以下五个聚合命令. 其中,count.distinct和group会提供很基本的功能,至于其他的高级聚合功能(sum.average.ma ...

  10. Python全栈 MongoDB 数据库(聚合、二进制、GridFS、pymongo模块)

    断网了2天  今天补上     聚合操作: 对文档的信息进行整理统计的操作 返回:统计后的文档集合 db.collection.aggregate() 功能:聚合函数,完成聚合操作 参数:聚合条件,配 ...

随机推荐

  1. Arduino入门笔记(1):认识Arduino

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 各种网站论坛里经常看到网友DIY各种遥控小车.机器人什么的,一直很好奇,很想学习一 ...

  2. android java.lang.ExceptionInInitializerError

    11-08 13:36:05.108: E/AndroidRuntime(5318): java.lang.ExceptionInInitializerError 11-08 13:36:05.108 ...

  3. day76

    昨日回顾:  1 ajax 什么是ajax:异步的JavaScript 和xml  2 特点:异步,局部刷新  3 简单的与后台交互:(携带数据:可以拼到url上---->从GET中取,)   ...

  4. day 26

    今日内容 classmethod 让这个类中的方法绑定自己类,这样就可以直接用类调用该方法. staticmethod 让类中的方法编程非绑定方法,也就是是这个类中的方法编程普通函数. ####### ...

  5. 半导体热阻问题深度解析(Tc,Ta,Tj,Pc)

    半导体热阻问题深度解析(Tc,Ta,Tj,Pc) 本文是将我以前的<有关热阻问题>的文章重新梳理,按更严密的逻辑来讲解. 晶体管(或半导体)的热阻与温度.功耗之间的关系为: Ta=Tj-* ...

  6. Java关键字(二)——native

    本篇博客我们将介绍Java中的一个关键字——native. native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() 方法.hashCode()方法 ...

  7. [HNOI2012]矿场搭建 BZOJ2730 点双+结论

    Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...

  8. 20155306 白皎 0day漏洞——漏洞利用原理之GS

    20155306 白皎 0day漏洞--漏洞利用原理之GS 一.GS安全编译选项的保护原理 1.1 GS的提出 在第二篇博客(栈溢出利用)中,我们可以通过覆盖函数的返回地址来进行攻击,面对这个重灾区, ...

  9. centos 6.5 搭建开源堡垒机 Teleport 遇到的问题解决

    几款开源的堡垒机 下面进行 teleport 的安装: https://docs.tp4a.com/install/#11 异常1:libc.so.6: version `GLIBC_2.14' no ...

  10. [BZOJ1135][POI2009]Lyz[霍尔定理+线段树]

    题意 题目链接 分析 这个二分图匹配模型直接建图的复杂度太高,考虑霍尔定理. 对于某些人组成的区间,我们只需要考虑他们的并是一段连续的区间的集合.更进一步地,我们考虑的人一定是连续的. 假设我们考虑的 ...