聚合:
主要用于计算和统计等,类似sql种的sum() avg()
db.集合.aggregate( { 管道:{表达式} } ) 常用的管道:
$group:将集合中的文档按照字段进行分组
$match:过滤数据,输出符合条件的文档
$project:修改文档的结构,重命名、增加、删除字段,创建结果,类似投影,指定字段显示结果
$sort:排序
$limit:限制返回文档条数
$skip:跳过指定数量的文档
$unwind:对列表类型字段内容拆分 常用表达式: $表达式:"$字段"
$sum:计算总数量,$sum:1 代表按照1倍进行统计总数量
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:结果文档插入到一个数组给配合分组使用
$first:获取排序后第一个文档数据
$last:获取排序后最后一个文档数据 $group: {_id:"$字段"} 指定字段分组,id为null代表全部数据为一组
例如:统计男生、女生的人数
db.stu.aggregate(
{$group:{
_id:"$gender", //按照gender进行排序
total:{$sum:1} //自己设置一个字段total用于保存统计每个组的人数
// $sum:1 代表按照一倍进行统计总数量
}}
) _id:null 代表所有数据分为一组
例如: 求总人数和平均年龄
db.stu.aggregate(
{$group:{
_id:null, //整个数据分为一组
total:{$sum:1}, //按照一倍统计总数量
avg_age:{$avg:"$age"} //按照字段年龄求平均数
}}
) $push: 透视数据,将符合分组条件的字段插入到结果列表当中,"$$ROOT"可以令整个文档插入列表
例如:按照性别统计姓名:
db.stu.aggregate(
{$group:{
_id:"$gender", //按照性别进行分组
names:{$push:"$name"} //将符合分组的name字段值插入 names的列表里
}}
) 例如: 按照性别,统计文档
db.stu.aggregate(
{$group:{
_id:"$gender", //按照性别进行分组
info:{$push:"$$ROOT"} //将符合分组的文档插入到info列表当中
}}
) $match: 过滤数据,输出符合条件的文档
例如:查询年龄大于20的学生
db.stu.aggregate(
{$match:{age:{$gt:20}}} //年龄大于20
) 例如:查询年龄大于20的男生女生分别的人数。(多个管道进行并列)
db.stu.aggregate(
{$match:{age:{$gt:20}}}, //年龄大于20 筛选出符合条件的数据
{$group:{
_id:"$gender", //按照性别分组
total:{$sum:1} //求出总数量
}}
) $project: 类似投影,指定字段进行显示结果
例如: 查询学生的姓名、年龄
db.stu.aggregate(
{$project:{
_id:0,
name:1, //指定为1代表显示,指定为0代表不显示
age:1
}}
) 例如:查询男女生,输出人数
db.stu.aggregate(
{$group:{ //按照性别分组后统计人数
_id:"$gender",
total:{$sum:1}
}},
{$project:{
_id:0, //指定只输出总数 不输出_id
total:1
}}
) $sort: 排序后输出,1为升序 -1为降序
例如: 查询学生信息,按年龄升序
db.stu.aggregate(
{$sort:{age:1}}
) 例如: 查询男女生的人数并按人数降序
db.stu.aggregate(
{$group:{ //按年龄排序求出总人数
_id:"$gender",
total:{$sum:1}
}},
{$sort:{total:-1}} //按照total的降序排列
) $skip和$limit:
$skip:num 越过前num条文档
$limit:num 显示num条文档
先skip再limit实现分页的功能 例如:查询3到7条(略过前2条,查询5条)
db.stu.aggregate(
{$skip:2},
{$limit:5}
) $unwind:对文档中包含列表类型按照列表内元素个数数据进行拆分成多条
构造数据:db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
拆分: db.t2.aggregate( {$unwind:"$size"} )
结果: { "_id" : 1, "item" : "t-shirt", "size" : "S" }
{ "_id" : 1, "item" : "t-shirt", "size" : "M" }
{ "_id" : 1, "item" : "t-shirt", "size" : "L" } 处理空数组、非数组、无字段、null情况:(按如上操作会丢失查询结果)
需要指定preserveNullAndEmptyArrays: true代表保留空文档,false代表不保留空文档
构造数据: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 }
])
丢数据的拆分: db.t3.aggregate({ $unwind:"$size" })
空的size仍然保留信息: db.t3.aggregate({ $unwind:"$size",preserveNullAndEmptyArrays:true })

mongodb聚合的使用的更多相关文章

  1. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  2. Mongodb学习笔记四(Mongodb聚合函数)

    第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...

  3. mongodb MongoDB 聚合 group

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

  4. MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  5. MongoDB聚合

    --------------------MongoDB聚合-------------------- 1.aggregate():     1.概念:         1.简介             ...

  6. MongoDB 聚合分组取第一条记录的案例及实现

    关键字:MongoDB: aggregate:forEach 今天开发同学向我们提了一个紧急的需求,从集合mt_resources_access_log中,根据字段refererDomain分组,取分 ...

  7. mongodb MongoDB 聚合 group(转)

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

  8. mongodb聚合 group

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

  9. MongoDB 聚合(管道与表达式)

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

  10. 【Mongodb教程 第十一课 】MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

随机推荐

  1. Intel 移位指令的陷阱(转)

    今天发现了一个Intel逻辑左移指令shl的一个bug.   逻辑左移的概念是对给定的目的操作数左移COUNT次,每次移位时最高位移入标志位CF中,最低位补零. 其中OPRD1为目的操作数, 可以是通 ...

  2. Objective-C 中的 BOOL

    之前开发了一个针对单个数据模型,自动建表.增删改查等操作的 ORM 库,后边在 iPhone 5c 上使用时,出现了 crash 的情况. 该项目在 Github 开源,项目地址为SXJDatabas ...

  3. SpringMvc的传递参数方式 -- url / requestMapping

    在使用spring的项目中,前台传递参数到后台是经常遇到的事, 我们必须熟练掌握一些常用的参数传递方式和注解的使用,废话少说,直接上正文. 1. @requestMapping: 类级别和方法级别的注 ...

  4. java排序算法(六):直接插入排序

    java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1 ...

  5. ES6 中 Promise 详解

    Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API ...

  6. 使用属性升级MyBank

    一.访问修饰符  private   :使用private访问修饰符修饰的属性或者方法只能在本类中使用 public    :可以在任何类中访问到 二.this 关键字:代表当前类,this.属性:代 ...

  7. 假设检验(Hypothesis Testing)

    假设检验(Hypothesis Testing) 1. 什么是假设检验呢? 假设检验又称为统计假设检验,是数理统计中根据一定假设条件由样本推断总体的一种方法. 什么意思呢,举个生活中的例子:买橘子(借 ...

  8. 『开源重编译』System.Data.SQLite.dll 自适应 x86 x64 AnyCPU 重编译

    背景: > System.Data.SQLite.dll 程序集 不能良好的支持 AngCPU 格式 System.Data.SQLite.dll 在 适应 x86 和 x64 有三个方案: & ...

  9. Beta冲刺 第四天

    Beta冲刺 第四天 1. 昨天的困难 1.网页使用了一些网上现成的模板,其主要是使用像素做处理的,所以检查起来比较费事费力. 2.使用github代码merge时出现了问题.所以花费了不少的时间在人 ...

  10. 每日冲刺报告——Day3(Java-Team)

    第三天报告(11.4  周六) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...