1.聚合
聚合(aggregate)就是把管道合在一起操作,可以对每个阶段(stage)的管道进行分组、过滤等操作
聚合语法
db.集合名称.aggregate([
{管道名 : {表达式}},
{管道名 : {表达式}},
{管道名 : {表达式}},
...
])
准备测试数据
db.stu.insert([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },
{"name" : "黄蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },
{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },
{"name" : "黄药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },
{"name" : "段誉", "hometown" : "大理", "age" : 16, "gender" : true },
{"name" : "段王爷", "hometown" : "大理", "age" : 45, "gender" : true },
{"name" : "洪七公", "hometown" : "桃花岛", "age" : 50, "gender" : true }])
2.常用的管道和表达式
2.1 管道
$group
: 按照某个字段进行分组,依次对每个组进行统计计算$match
: 匹配出符合条件的数据,和find操作一致$project
: 和投影作用一样,可以控制字段不显示$sort
: 将输⼊⽂档排序后输出$limit
: 限制聚合管道返回的⽂档数$skip
: 跳过指定数量的⽂档, 并返回余下的⽂档
2.2 表达式
$sum
: 计算总和, $sum:1 表示以⼀累加计数,相当于count统计数量$avg
: 计算平均值$min
: 获取最⼩值$max
: 获取最⼤值$push
:把分组后的内容放入到列表中
3.$group
$group是按照某个字段进行分组操作
3.1 与$sum表达式
比如说以hometown字段进行分组,再统计不同hometown的个数
db.stu.aggregate([{
$group: {
_id: "$hometown",
"家乡数量统计":{$sum: 1},
}
}])
# _id表示按照某个字段进行分组,但是内部的字段名称前面必须添加$字符
# _id设置为 null 表示把所有数据作为一组看待
3.2 与$avg表达式
# 查看全部平均年龄
db.stu.aggregate([{$group:{_id:null,"平均年龄":{$avg:"$age"}}}])
# 查看每个hometown的平均年龄
db.stu.aggregate([{$group:{_id:"$hometown","平均年龄":{$avg:"$age"}}}])
3.3 数据透视
# 以hometown分组,统计每一组中的名字以列表的形式展示
db.stu.aggregate([{
$group: {
_id: "$hometown",
"name_list":{$push: "$name"}
}
}])
4.$match
$match用于数据的过滤,类似于find(),但$match可以把结果交给下一个管道处理
# 查询年龄大于20, 以hometown分组, 统计数量
db.stu.aggregate([
{
$match:{age:{$gt:20}}
},
{
$group: {
_id: "$hometown",
"counter": {$sum: 1}
}
}
])
5.$project
$project类似于投影,可以控制字段的显示与隐藏
# 通过性别分组,统计人数,但最后只展示统计人数
db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$project:{_id:0,counter:1}}])
6.$sort
$sort用于将输入的文档排序后输出,1为升序,-1为降序
# 查询男性英雄信息,按照年龄降序排序
db.stu.aggregate([
{$match: {gender:true}},
{$sort: {age:-1}}
])
7.$skip和$limit
# 统计男女生人数,按照人数降序,返回第二条数据
db.stu.aggregate([
{$group:{
_id: "$gender",
gender_count:{$sum:1}
}},
{$sort: {gender_count: -1}},
{$skip: 1},
{$limit:1}
])