练习数据
db.students.insert( [ {'_id':0, 'name': '小林', 'gender': '男', 'age': 20}, {'_id':1, 'name': '小黑', 'gender': '男', 'age': 20}, {'_id':2, 'name': '小白', 'gender': '男', 'age': 22}, {'_id':3, 'name': '小小林', 'gender': '女', 'age': 21}, {'_id':4, 'name': '小徐', 'gender': '女', 'age': 19}, {'_id':5, 'name': '小吴', 'gender': '女', 'age': 20}, {'_id':6, 'name': '小红', 'gender': '女', 'age': 30}, {'_id':7, 'name': '小明', 'gender': '男', 'age': 20}, {'_id':8, 'name': '小林', 'gender': '男', 'age': 19}, {'_id':9, 'name': '小林', 'gender': '男', 'age': 20}, {'_id':10, 'name': '张小红', 'gender': '女', 'age': 19}, ] )
插入数据
聚合 aggregate
聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
语法
db.集合名称.aggregate([{管道:{表达式}}])
管道
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入
在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理
常用管道
- $group:将集合中的文档分组,可用于统计结果
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
- $unwind:将数组类型的字段进行拆分
表达式
处理输入文档并输出
常用表达式
- $sum:计算总和,$sum:1同count表示计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
- $first:根据资源文档的排序获取第一个文档数据
- $last:根据资源文档的排序获取最后一个文档数据
$group
将集合中的文档分组,可用于统计结果
_id表示分组的依据,使用某字段的格式为 $字段
举例:统计男生和女生的总人数
db.students.aggregate( [ {$group: { _id: "$gender", counter: {$sum: 1} } } ] )
将集合中所有文档分为一组,求学生总人数和平均年龄
db.students.aggregate( [ {$group: { _id: null, counter: {$sum: 1}, avgAge: {$avg: '$age'} } } ] )
统计学生性别和姓名
db.students.aggregate( [ {$group: { _id: '$gender', name: {$push: '$name'} } } ] )
使用$$ROOT可以将文档加入到结果集的数组中
db.students.aggregate( [ {$group: { _id: '$gender', name: {$push: '$$ROOT'} } } ] ).pretty()
$match
用于过滤数据,只输出符合条件的文档
举例:查询年龄大于20的学生
db.students.aggregate( [ {$match: {age:{$gt: 20}} } ] )
查询年龄大于20的男生女生人数
db.students.aggregate( [ {$match: {age:{$gt: 20}}, }, {$group: { _id: '$gender', counter: {$sum: 1} } } ] )
$project
修改输入文档的结构
举例:查询学生的姓名和年龄
db.students.aggregate( [ {$project: { _id: 0, name: 1, age: 1 } } ] )
查询男生女生人数,并输出人数
db.students.aggregate( [ {$group: { _id: '$gender', counter: {$sum: 1} } }, {$project: { _id: 1, counter: 1 } } ] )
$sort
将输入文档排序后输出
举例:查询学生信息,按年龄升序
db.students.aggregate( [ {$sort: {age: 1} } ] )
查询男生女生人数,按人数降序
db.students.aggregate( [ {$group: { _id: '$gender', counter: {$sum: 1} } }, {$sort: { counter: -1 } } ] )
$limit
限制聚合管道返回的文档数
举例:查询两条学生信息
db.students.aggregate( [ {$limit: 2} ] )
$skip
跳过指定数量的文档,并返回余下文档
举例:查询从第三条开始的学生信息
db.students.aggregate( [ {$skip: 2} ] )