1. mongodb的聚合是什么

聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
语法:db.集合名称.aggregate({管道:{表达式}})
 

2. mongodb的常用管道和表达式

2.1 常用管道命令

在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理 常用管道命令如下:
  • $group: 将集合中的⽂档分组, 可⽤于统计结果
  • $match: 过滤数据, 只输出符合条件的⽂档
  • $project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
  • $sort: 将输⼊⽂档排序后输出
  • $limit: 限制聚合管道返回的⽂档数
  • $skip: 跳过指定数量的⽂档, 并返回余下的⽂档

2.2 常用表达式

表达式:处理输⼊⽂档并输出 语法:表达式:'$列名' 常⽤表达式:
  • $sum: 计算总和, $sum:1 表示以⼀倍计数
  • $avg: 计算平均值
  • $min: 获取最⼩值
  • $max: 获取最⼤值
  • $push: 在结果⽂档中插⼊值到⼀个数组中

3. 管道命令之$group

3.1 按照某个字段进行分组

$group是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组,可用于统计结果
使用示例如下
db.stu.aggregate(
{$group:
{
_id:"$gender",
counter:{$sum:1}
}
})
其中注意点:
  • db.db_name.aggregate是语法,所有的管道命令都需要写在其中
  • _id 表示分组的依据,按照哪个字段进行分组,需要使用$gender表示选择这个字段进行分组
  • $sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数

3.2 group by null

当我们需要统计整个文档的时候,$group 的另一种用途就是把整个文档分为一组进行统计
使用实例如下:
db.stu.aggregate(
{$group:
{
_id:null,
counter:{$sum:1}
}
})
其中注意点:
  • _id:null 表示不指定分组的字段,即统计整个文档,此时获取的counter表示整个文档的个数

3.3 数据透视

正常情况在统计的不同性别的数据的时候,需要知道所有的name,需要逐条观察,如果通过某种方式把所有的name放到一起,那么此时就可以理解为数据透视
使用示例如下:
  1. 统计不同性别的学生
    db.stu.aggregate(
    {$group:
    {
    _id:null,
    name:{$push:"$name"}
    }
    }
    )
  2. 使用$$ROOT可以将整个文档放入数组中
    db.stu.aggregate(
    {$group:
    {
    _id:null,
    name:{$push:"$$ROOT"}
    }
    }
    )

4.管道命令之$match

$match用于进行数据的过滤,是在能够在聚合操作中使用的命令,和find区别在于$match 操作可以把结果交给下一个管道处理,而find不行
使用示例如下:
  1. 查询年龄大于20的学生
    db.stu.aggregate(
    {$match:{age:{$gt:20}}
    )
  2. 查询年龄大于20的男女学生的人数
    db.stu.aggregate(
    {$match:{age:{$gt:20}}
    {$group:{_id:"$gender",counter:{$sum:1}}}
    )

5. 管道命令之$project

$project用于修改文档的输入输出结构,例如重命名,增加,删除字段
使用示例如下:
  1. 查询学生的年龄、姓名,仅输出年龄姓名
    db.stu.aggregate(
    {$project:{_id:0,name:1,age:1}}
    )
  2. 查询男女生人生,输出人数
    db.stu.aggregate(
    {$group:{_id:"$gender",counter:{$sum:1}}}
    {$project:{_id:0,counter:1}}
    )

6. 管道命令之$sort

$sort用于将输入的文档排序后输出
使用示例如下:
  1. 查询学生信息,按照年龄升序
    db.stu.aggregate({$sort:{age:1}})
  2. 查询男女人数,按照人数降序
    db.stu.aggregate(
    {$group:{_id:"$gender",counter:{$sum:1}}},
    {$sort:{counter:-1}}
    )

7. 管道命令之$skip 和 $limit

  • $limit限制返回数据的条数
  • $skip 跳过指定的文档数,并返回剩下的文档数
  • 同时使用时先使用skip在使用limit
使用示例如下:
  1. 查询2条学生信息
    db.stu.aggregate(
    {$limit:2}
    )
  2. 查询从第三条开始的学生信息
    db.stu.aggregate(
    {$skip:3}
    )
  3. 统计男女生人数,按照人数升序,返回第二条数据
    db.stu.aggregate(
    {$group:{_id:"$gender",counter:{$sum:1}}},
    {$sort:{counter:-1}},
    {$skip:1},
    {$limit:1}
    )
 

mongodb聚合操作的更多相关文章

  1. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  2. MongoDB 聚合操作(转)

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  3. mongodb聚合查询-aggregate

    Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...

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

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

  5. MongoDB 基本操作和聚合操作

    一 . MongoDB 基本操作 基本操作可以简单分为查询.插入.更新.删除. 1 文档查询 作用 MySQL SQL  MongoDB  所有记录  SELECT * FROM users;  db ...

  6. Yii2的mongodb的聚合操作

    最近项目使用到mongodb的聚合操作,但是yii文档中对这方面资料较少,记录下 $where['created_time'] = ['$gt' => "$start_date_str ...

  7. MongoDB中的聚合操作

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

  8. MongoDB的聚合操作以及与Python的交互

    上一篇主要介绍了MongoDB的基本操作,包括创建.插入.保存.更新和查询等,链接为MongoDB基本操作. 在本文中主要介绍MongoDB的聚合以及与Python的交互. MongoDB聚合 什么是 ...

  9. MongoDB入门---聚合操作&管道操作符&索引的使用

    经过前段时间的学习呢,我们对MongoDB有了一个大概的了解,接下来就要开始使用稍稍深入一点的东西了,首先呢,就是MongoDB中的聚合函数,跟mysql中的count等函数差不多.话不多说哈,我们先 ...

随机推荐

  1. Linux root目录下.gvfs问题处理

    最近收到一些关于磁盘的告警. 查了一下相关的信息. 知道了.gvfs文件夹是GNOME桌面系统的虚拟文件系统.可能是一些其它远程桌面之前连接所产生的一个文件,确定没有人再远程后.可以手动干掉它. 通过 ...

  2. 对于在git上面拉代码报"error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054"解决方法

    主要原因是安全设置的问题: 首先执行git config http.sslVerify "false"   若出现下列错误 git config http.sslVerify &q ...

  3. windows搭建zabbix agent

    1.下载和解压zabbix agent 地址: http://www.zabbix.com/downloads/2.4.4/zabbix_agents_2.4.4.win.zip解压:conf目录存放 ...

  4. Jquery+H5验证数据(不是表单验证啊 )

    啥也不说了 直接上代码 1.我将所有需要验证的控件都加上了   required(类名自己定吧没啥讲究)  class 2.所有的控件都加上了 data-vname的H5自定义属性(名称自个定义吧) ...

  5. JMETER java.net.SocketTimeoutException: Read timed out

    将JMETER脚本里的请求超时时间由1000ms 修改为 10000ms,该错误不再出现.

  6. R语言如何读取.csv文件

    以下是我关于如何在R语言中读取.csv文件及一些需要注意的细节的总结,希望能帮助到大家~

  7. 如何看iOS崩溃日志

    重点:Triggered by Thread这句话后边的线程号,快速定位问题出现在那个线程,是否是你的锅:Triggered by Thread所指的线程表示导致异常.崩溃的线程 下边内容转自简书 简 ...

  8. Centos 系统swap虚拟内存添加与删除配置

    SWAP是Linux中的虚拟内存,用于扩充物理内存不足而用来存储临时数据存在的.它类似于Windows中的虚拟内存.在Windows中,只可以使用文件来当作虚拟内存.而linux可以文件或者分区来当作 ...

  9. php JS 导出表格特殊处理

    但是这样导出身份证号会变为科学计数: 解决方法就是: 我们了解一下excel从web页面上导出的原理.当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取 它,所以把mi ...

  10. postma概念与使用

    Postman是google开发的一款功能强大的网页调试与发送网页HTTP请求,并能运行测试用例的的Chrome插件.Postman作为一个chrome的插件,你可以打开chrome,在chrome ...