聚合 aggregate
聚合是基于数据处理的聚合管道,每个文档通过一个有多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组过滤等功能,然后进行一系列处理,输出相应的结果
db.集合名.aggregate({管道:{表达式}})
常用管道
$group分组
- 按照gender进行分组,获取不同数据的个数和平均年龄
db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}})
- 按照hometown进行分组,获取不同组的平均年龄
db.stu.aggregate({$group:{_id:"$hometown",mean_age:{$avg:"$age"}}})
- 统计整个文档的年龄
db.stu.aggregate({$group:{_id:null,count:{$sum:1},mean_age:{$avg:"$age"}}})
$project改样式
能修改输入和输出的样式
db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}},
{$project:{gender:"$_id",count:1,avg_age:1,id:0}}
)
$match 管道里的find
用于过滤数据,只输出符合条件的数据
使用MongoBD的标准查询操作
区别:match是一个管道命令,能将结果交给后一个管道,但是find不可以
- 查询年龄大于20的男生女生人数
db.stu.aggregate({$match:{age:{$gt:20}}},
{$group:{_id:"$gender",count:{$sum:1}}},
{$project:{_id:0:gender:"$_id",count:1}}
)
$sort 排序
将输入文档排序后输出
- 查询男生,女生人数,按照人数降序
db.stu.aggregate({$group:{_id:"$gender",counter:{$sum:1}}}
{$sort:{counter:-1}}
)
$limit $skip
limit返回文档数,skip跳过制定文档数
先skip再limit效率高
$unwind
将文档中某一个数组类型拆分成多条,每条包含数组中的一个值
db.t.insert({_id:1,item:"t-shirt",size:['s','m','l']})
db.t.aggregate({$unwind:"$size"})
$unwind练习
数据库中有一条数据:{“username”:“Alex”,“tag”:[“C#”,“java”,“c++”]}如何获取改tag列表的长度
db.t.aggregate({$match:{username:"Alex"}},{$wind:"$tag"},{$group:{_id:null,sum:{$sum:1}}})