一、基础
1、什么是聚合?
聚合是基于数据处理的聚合管道,每个文档通过一个有多个阶段(stage)组成的管道
可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果
db.集合名称.aggregate({管道: {表达式}})
有点像Django中ORM聚合的语法
2、常用管道
$group: 将集合中的文档分组,用于统计结果 $match: 过滤数据,只输出符合条件的文档 $project: 修改输入文档的结构,如重命名、增加、删除字段、创建计算结果 $sort: 将输入文档排序后输出 $limit: 限制聚合管道返回的文档数 $skip: 跳过指定数量的文档,并返回余下的文档 $unwind(): 将列表(数组)类型的字段进行拆分
3、常用表达式
处理输入文档,并输出 语法: 表达式:'$列名' 常用表达式 $sum: 计算总和, $sum:1 表示以一倍计数 $avg: 计数平均值 $min: 获取最小值 $max: 获取最大值 $push: 在结果文档中插入值到一个数组中 $first: 根据资源文档的排序获取第一个文档数据 $last: 根据资源文档的排序获取最后一个文档数据
二、常用管道用法
1、$group
作用: 将集合中的文档分组,可用于统计结果 _id表示分组的依据,使用某个字段的格式为'$字段' 格式 db.集合名称.aggregate({$group:{ _id: '$字段', 自定义字段: {表达式: '$字段'}}}) db.stu.aggregate({$group: {_id: '$gender'}}) db.stu.aggregate({$group: {_id: '$gender', count: {$sum: 1}}}) db.stu.aggregate({$group: {_id: '$gender', avg_age: {$avg: '$age'}}}) db.stu.aggregate({$group: {_id: '$hometown', min_age: {$min: '$age'}, count: {$sum: 1}}}) 注意: _id后面的值,表示按照什么分组,格式'$字段' count, avg_count是自定义的字段 表达式的值是'$字段'
Group by null
将集合中所用文档分为一组,即该集合就是一个组 # 求学生的总量和平均年龄 db.stu.aggregate({$group: {_id: null, count:{$sum: 1}, avg_age:{$avg: '$age'}}})