• 聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
  • 语法:db.集合名称.aggregate({管道:{表达式}})

管道

  • 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入

ps ajx | grep mongo

  • 常用管道
  • $group:将集合中的文档分组,可用于统计结果
  • $match:过滤数据,只输出符合条件的文档
  • $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
  • $sort:将输入文档排序后输出
  • $limit:限制聚合管道返回的文档数
  • $skip:跳过指定数量的文档,并返回余下的文档
  • $unwind:将数组类型的字段进行拆分

表达式:处理输入文档并输出

  • 语法:表达式:'$列名'

常用表达式

  • $sum:计算总和,$sum:1 表示以一倍计数
  • $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}}}
)

$project

  • 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
  • 例1:查询学生的姓名、年龄

db.stu.aggregate(
   {$project:{_id:0,name:1,age:1}}
)

$sort

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

b.stu.aggregate({$sort:{age: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情况
  • 属性preserveNullAndEmptyArrays值为false表示丢弃属性值为空的文档
  • 属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档

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:'$size',preserveNullAndEmptyArrays:

true}})

4.聚合aggregate相关推荐

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

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

  2. 聚合 aggregate

    聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...

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

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

  4. Mongodb数据 ,聚合 aggregate

    聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...

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

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

  6. MongoDB聚合aggregate操作集锦

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

  7. django中聚合aggregate和annotate GROUP BY的使用方法

    接触django已经很长时间了,但是使用QuerySet查询集的方式一直比较低端,只会使用filter/Q函数/exclude等方式来查询,数据量比较小的时候还可以,但是如果数据量很大,而且查询比较复 ...

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

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

  9. golang mongodb 聚合(Aggregate) github.com/qiniu/qmgo框架

    项目场景: 最近使用golang 来访问mongodb 出了点问题 github.com/qiniu/qmgo对于数据聚合踩了坑 官方的demo给的太少没有多分支的场景 问题描述: 网上对于golan ...

最新文章

  1. iOS11隐藏导航条后顶部有20单位的空白或者pop页面时明显感觉前一个页面有上移的异常动画的解决办法。
  2. 第一章 Linux系统简介
  3. 如何获取 Teams Meeting 的上下文信息
  4. y空间兑换代码_loam代码解析3
  5. 算法求解方法与思路的总结
  6. 电脑开机3秒就重启循环_手机怎么才能投屏到电脑上?3个方法,小屏1秒变大屏,涨知识了...
  7. github README.md使用
  8. 【干货】关于机器学习的知识点,全在这篇文章里了
  9. 【Flutter】Dart中的类和对象
  10. Ubuntu安装Python2.7,nodejs,Redis
  11. Android开发之内容提供者ContentProvider
  12. 手机版q群管机器人_手机QQ机器人怎么用,QQ机器人手机版怎么设置
  13. 高斯-勒让德积分学习
  14. 影子系统PowerShadow v2.6.0511中文破解版
  15. 关于建立企业邮箱的解决方案
  16. java怎么查看源代码
  17. UE4 GamePlay架构
  18. 此共享需要过时的SMB1协议及centos6.8的samba3升级samba4.0
  19. 4k视频写入速度要求_4K视频要用什么卡?极速专业存储卡盘点
  20. WhbtomT(半路出家) 的每日英语 收集 (四)

热门文章

  1. 175. Combine Two Tables
  2. 这本轻小说真厉害 2016
  3. loadView加载(变换成ScrollView)
  4. shell脚本判断文件类型
  5. fedora10完全配置文档连接网址
  6. windows服务编程 注册InstallUtil.exe
  7. Linux/Windows系统内核性能调优
  8. TCP协议-相关面试题
  9. 我张哥做的这ARM开发板,真酸爽!
  10. 嵌入式软件面试(基础题)总结,不断更新