mongodb的聚合操作
时间:2023-3-1 19:51 作者:wen 分类: mongodb
一、mongodb的聚合是什么
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
语法:db.集合名称.aggregate({管道:{表达式}})
二、常用管道和表达式
1、常用的管道命令
- $grop:将集合中的文档分组,可用户统计结果
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
2、常用的表达式
表达式:处理输入文档并输出
语法:表达式:'$列名'
常用表达式:
- $sum:计算总和,$sum:1表示以一倍计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
三、管道命令之$group
1、按照某个字段进行分组
$group是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组,可用于统计结果
db.stu.aggregate({
$group:{_id:"$gender",counter:{$sum:1}}
})
其中注意:
- db.db_name.aggregate 是语法,所有的管道命令都需要写在其中
- _id 表示分组的依据,安装那个字段分组,需要使用$gender表示选择这个字段进行分组
- $sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数
2、group by null
当我们需要统计整个文档的时候,$gender 的另一种用途就是把整个文档分为一组进行统计
db.stu.aggregate({
$group:{_id:null,counter:{$sum:1}}
})
其中注意:
- _id:null 表示不指定分组的字段,即统计整个文档,此时过去的counter表示整个文档个数
3、数据透视
正常情况在统计的不同性别的数据的时候,需要知道所有的name,需要逐条观察,如果通过某种方式把所有的name放到一起,那么此时就可以理解为数据透视
- 统计不同性别的学生
db.stu.aggregate({ $group:{_id:null,name:{$push:"$name"}} })
- 使用$$ROOT可以将整个文档放入数组中
db.stu.aggregate({ $group:{_id:null,name:{$push:"$$ROOT"}} })
四、管道命令之$match
$match用户进行数据的过滤,是在能够在聚合操作中使用的命令,和find区别在于$match操作可以把结果交给下一个管道处理,而find不行
- 查询年龄大于20的学生
db.stu.aggregate({ $match:{age: {$gt:20}} })
- 查询年龄大于20的男女学生的人数
db.stu.aggregate({ $match:{age: {$gt:20}} },{ $group:{_id:"$gender",counter:{$sum:1}} })
五、管道命令之$project
$project用于修改文档的输入输出结构,例如重命名,增加、删除字段
- 查询学生的年龄、姓名,仅输出年龄
db.stu.aggregate({ $project:{_id:0,name:1,age:1} })
- 查询男女生人数,输出人数
db.stu.aggregate({ $group:{_id:"$gender",counter:{$sum:1}} },{ $project:{_id:0,name:1,age:1} })
六、管道命令之$sort
$sort 用于将输入的文档排序后输出
- 查询学生信息,按照年龄升序
db.stu.aggregate({ $sort:{age:1} })
- 查询男女人数,按照人数降序
db.stu.aggregate({ $group:{_id:"$gender",counter:{$sum:1}} },{ $sort:{counter:-1} })
七、命令管道之$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
})
八、管道命令之 $unwind
nwind 拆分列表字段为多条数据
db.stu.aggregate({
$unwind:"$size"
})
db.stu.aggregate({
$unwind:{path:"$size",preserveNullAndEmptyArrays:true}
})
标签: mongodb