分组:$group()

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

透视数据: $push统计函数

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

过滤:$match

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

修改文档结构: $project

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

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

排序$sort()

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

$skip&$limit

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

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

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

$unwind

将⽂档中的某⼀个数组类型字段拆分成多条, 每条包含数组中的⼀个值
db.集合名称.aggregate({$unwind:'$字段名称'})
db.t3.insert({_id:1,item:'t-shirt',size:['S','M','L']})
--$unwind 将集合拆分
db.t3.aggregate({$unwind:'$size'})
结果:
 
{ "_id" : 1, "item" : "t-shirt", "size" : "S" }
{ "_id" : 1, "item" : "t-shirt", "size" : "M" }
{ "_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. STM32 串口中断总结

    原文:https://blog.csdn.net/weixin_42480952/article/details/82981409 最近在学习使用dma传输方式进行串口通讯,感觉这个很详细,存一下 . ...

  2. (转)LVS+Keepalived使用总结 vip丢失

    /sbin/ifconfig lo: $vip broadcast $vip netmask 255.255.255.255 up /sbin/ifconfig lo: 172.16.254.63 b ...

  3. XML 的4种解析方式

    在上一篇博客中,我们介绍了什么是 XML ,http://www.cnblogs.com/ysocean/p/6901008.html,那么这一篇博客我们介绍如何来解析 XML . 部分文档引用:ht ...

  4. 相亲神器记录Swift1.2

    这个简单APP是用swfit1.2写的,主要重点是:1.点击键盘return键可退出键盘. 2.各个控件值的传递. Storyboard界面设计: View代码: import UIKit class ...

  5. asp.net mvc session锁问题 (转载)

    一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...

  6. 【H5】直接拨打电话

    一般<a href="tel:400-663-5999">400-663-5999</a>实现. 而形如<a href="tel:*9204 ...

  7. 大数据入门第二十一天——scala入门(一)并发编程Actor

    注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃 一. ...

  8. 2017-2018-2 20155203《网络对抗技术》Exp2 后门原理与实践

    基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 通过下载带后门的程序或者点开带有后门的软件,或者后门本身就在我的系统里: (2)例举你知道的后门如何启动起来(win及linux) ...

  9. 20155302《网络对抗》Exp3 免杀原理与实践

    20155302<网络对抗>Exp3 免杀原理与实践 实验要求 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编 ...

  10. 20155308《信息安全系统设计基础 嵌入式C语言课堂考试补博客

    20155308<信息安全系统设计基础 嵌入式C语言课堂考试补博客 知识点 置位 ?bits = bits | (1 << 7) ; /* sets bit 7 */ bits |= ...