常用表达式:
'''
$sum:计算总和,$sum:1同count表示计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据
'''
聚合函数:
聚合(aggregate)主要用于计算数据 类似于 sum() avg()
group 分组
1,将集合中的文档分组,可用于统计结果
2,_id表示分组的依据,使用某个字段的格式为'$字段'
# 通过 gender 进行分组 计算每组的平均数 总和($sum:1) 名称列表形式
# _id 决定了以什么分组 '_id:null' 表示所有的分成一组 取值使用的 '$ + 字段' 的形式!
db.stu.aggregate([{$group:{_id:"$gender",num_tutorial:{$avg:'$age'},counter:{$sum:1},name:{$push:'$name'}}}])# _id 重复的话 会替换掉前面的 下面表明以 name 分组
db.stu.aggregate([{$group:{_id:"$gender",_id:"$name",num_tutorial:{$avg:'$age'}}}]
match 过滤数据:
1,用于过滤数据,只输出符合条件的文档
2,MongoDB的标准查询操作
# 过滤出年龄大于 20的
db.stu.aggregate([{$match:{age:{$gt:20}}} ]);
# 先过滤然后分组
db.stu.aggregate([{$match:{age:{$gt:28}}},{$group:{_id:'$gender',counter:{$sum:1}}} ]);
project 修改输出
1, 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
2, 可以用 project 指定文档输出样式
2, 字段后面跟着 0 或者 1 表明显示与不显示
# 聚合函数 只显示 name 与 age 不显示 _id
db.stu.aggregate([{$project:{_id:0,name:1,age:1}}])
# 根据 gender 进行分组 但是只显示 counter 字段 其他不显示(默认都要显示的!)
db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$project:{_id:0,counter:1}} ])
sort 文档排序:
1,将输入文档排序后输出
2, 1 表示升序 -1 表示降序
# 依照年龄进行 升序排序
db.stu.aggregate([{$sort:{age:1}}])
# 根据gender 分组 计算总数($sum:1) 然后根据 counter 进行降序
db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}}])
unwind 数组字段的遍历:
1,将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
# 创建新的数组 集合 里面包含 数组
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
# 会显示三行 每一行 使用 size 的一个值
db.t2.aggregate([{$unwind:'$size'}])
# 上一个查询 对于空数组、无字段、null的文档,都被丢弃了
# 增加 preserveNullAndEmptyArrays 不会丢失字段
db.t3.aggregate([{$unwind:{path:'$size',preserveNullAndEmptyArrays:true}}])
![](https://img2018.cnblogs.com/blog/1381831/201810/1381831-20181018140247069-1989480755.png)