聚合 aggregate

聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
语法
db.集合名称.aggregate([{管道:{表达式}}])
管道
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入
ps ajx | grep mongo
在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理
常用管道
$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档,并返回余下的文档
unwind:将数组类型的字段进行拆分表达式处理输入文档并输出语法表达式:′unwind:将数组类型的字段进行拆分 表达式 处理输入文档并输出 语法 表达式:'unwind:将数组类型的字段进行拆分表达式处理输入文档并输出语法表达式:′列名’
常用表达式
sum:计算总和,sum:计算总和,sum:计算总和,sum:1同count表示计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据

$group

将集合中的文档分组,可用于统计结果
_id表示分组的依据,使用某个字段的格式为’$字段’
例1:统计男生、女生的总人数

db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}}
])

Group by null

将集合中所有文档分为一组
例2:求学生总人数、平均年龄

db.stu.aggregate([{$group:{_id:null,counter:{$sum:1},avgAge:{$avg:'$age'}}}
])

透视数据
例3:统计学生性别及学生姓名

db.stu.aggregate([{$group:{_id:'$gender',name:{$push:'$name'}}}
])

使用$$ROOT可以将文档内容加入到结果集的数组中,代码如下
db.stu.aggregate([

    {$group:{_id:'$gender',name:{$push:'$$ROOT'}}}
])

$match

用于过滤数据,只输出符合条件的文档
使用MongoDB的标准查询操作
例1:查询年龄大于20的学生

db.stu.aggregate([{$match:{age:{$gt:20}}}
])

例2:查询年龄大于20的男生、女生人数

db.stu.aggregate([{$match:{age:{$gt:20}}},{$group:{_id:'$gender',counter:{$sum:1}}}
])
$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}}
])

$sort

将输入文档排序后输出
例1:查询学生信息,按年龄升序

b.stu.aggregate([{$sort:{age:1}}])

例2:查询男生、女生人数,按人数降序

db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}}
])

$limit

限制聚合管道返回的文档数
例1:查询2条学生信息

db.stu.aggregate([{$limit:2}])

$skip

跳过指定数量的文档,并返回余下的文档
例2:查询从第3条开始的学生信息

db.stu.aggregate([{$skip:2}])

例3:统计男生、女生人数,按人数升序,取第二条数据

db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:1}},{$skip:1},{$limit:1}
])

注意顺序:先写skip,再写limit

$unwind

将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
语法1
对某字段值进行拆分

db.集合名称.aggregate([{$unwind:'$字段名称'}])

构造数据

db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})

查询

db.t2.aggregate([{$unwind:'$size'}])

语法2
对某字段值进行拆分
处理空数组、非数组、无字段、null情况

db.inventory.aggregate([{$unwind:{path:'$字段名称',preserveNullAndEmptyArrays:<boolean>#防止数据丢失}
}])

构造数据

db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])

使用语法1查询

db.t3.aggregate([{$unwind:'$size'}])

查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了
问:如何能不丢弃呢?
答:使用语法2查询

db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])

Mongodb数据 ,聚合 aggregate相关推荐

  1. mongoDB中聚合(aggregate)的具体使用

    mongoDB中聚合(aggregate)的具体使用 - 简书 最近在学习mongoDB的使用,本文来介绍一下其中aggregate的具体使用 先来看一个分组的例子,本例中$group是一个管道操作符 ...

  2. Python之数据聚合——aggregate()方法

    文章目录 使用内置统计方法聚合数据 面向列的聚合方法 aggregate()方法 对每一列数据应用同一个函数 对某列数据应用不同的函数 对不同列数据应用不同函数 使用内置统计方法聚合数据 实现数据拆分 ...

  3. MongoDB 添加、查询(条件查询、排序、分页、返回指定字段)、修改、删除数据、聚合aggregate

    MongoDB内部支持JavaScript语法,使用SpiderMonkey作为内部的JavaScript解释器引擎. 1.常用命令 show databases:显示数据库列表 use:切换数据库 ...

  4. MongoDB聚合aggregate操作集锦

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...

  5. mongodb 分组聚合_MongoDB干货总结

    什么是MongoDB 基于分布式文件存储的数据库,介于非关系型和关系型数据库之间. MongoDB和MySQL对比 MongoDB有什么特点 (1)面向集合存储数据,数据以json格式存储: (2)查 ...

  6. raster | R语言中的空间栅格对象及其基本处理方法(Ⅳ):数据聚合、重采样

    本篇示例数据: library(raster) # 2015年中国人口空间分布公里网格数据集 # 数据来源:https://www.resdc.cn/DOI/DOI.aspx?DOIid=32 pop ...

  7. mongo PHP aggregate,Mongodb中数据聚合之聚合管道aggregate

    在之前的两篇文章 Mongodb中数据聚合之基本聚合函数count.distinct.group 和 Mongodb中数据聚合之MapReduce 中,我们已经对数据聚合提供了两种实现方式,今天,在这 ...

  8. mongodb 日期分组聚合_mongoose聚合aggregate按日期分组计算

    简介 在MongoDB中,聚合(aggregate)主要用于进行处理数据,比如统计求和,求平均数等,并返回计算后的数据结果,这给我们带来了很多便捷之处,因为可以在读取数据的同时进行数据处理. 场景介绍 ...

  9. 数据聚合Spring Data MongoDB:嵌套结果

    1引言 在上一篇文章中,我们构建了聚合管道的基本示例. 如果您需要有关如何创建项目和配置应用程序的更多详细信息,也许您想看看使用Spring Data MongoDB和Spring Boot进行数据聚 ...

最新文章

  1. iptables规则备份和恢复,任务计划chkconfig工具systemd管理服务
  2. android ndk r8d,(Android) NDK
  3. 洛谷——P2083 找人
  4. JSP简单练习-一个简单的计数器
  5. centos7 升级curl版本
  6. “约见”面试官系列之常见面试题之第六十八篇之本地对象 内置对象 宿主对象(建议收藏)
  7. 【jQuery插件】textSlider 文字滚动插件
  8. elementui如何在input 框中搜索_【挑战自学Python编程】第八天:while循环以及input()函数...
  9. doip 源码_基于DoIP协议的汽车诊断系统开发
  10. 系统功能测试思维导图
  11. React Native可视化开发工具
  12. 宏观经济政策的六个争论问题 - 异想天开
  13. 《周志华机器学习》简要
  14. 时间序列及异常检测综述(资料)
  15. 好未来谢华亮:AI 在教育行业中的应用
  16. Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码
  17. 高校邦python程序设计基础_高校邦Python程序设计基础【实境编程】答案
  18. Hashcat 使用教程
  19. (3)DispatcherServlet与初始化主线
  20. java构造方法:有参构造方法和无参构造方法区别

热门文章

  1. Postman进阶篇(九)-动态变量(Dynamic variables)随机生成参数
  2. 痛惜,27岁名校博士生在答辩前夜跳崖自杀!
  3. 游戏服务端之AOI概述
  4. HTML入门 超详细
  5. 毕业设计结束,开始分享心得
  6. 时下我国鞋业ERP解决方案与需求分析
  7. CAD崩溃后自动保存的文件在哪里?
  8. 金牌访谈栏目《架构师说》上线,零距离对话架构师,畅聊技术产品故事
  9. 拳王虚拟项目公社:找副业?看如何利用虚拟资源,零成本自动化躺着赚钱
  10. @schedule 中 cron 的 0 */1 * * * ? 和 0 0/1 * * * ? 的区别