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 表示把所有数据作为一组看待

mongodb partition设置 mongodb aggregate limit_字段

3.2 与$avg表达式
# 查看全部平均年龄
db.stu.aggregate([{$group:{_id:null,"平均年龄":{$avg:"$age"}}}])

# 查看每个hometown的平均年龄
db.stu.aggregate([{$group:{_id:"$hometown","平均年龄":{$avg:"$age"}}}])

mongodb partition设置 mongodb aggregate limit_mongodb partition设置_02

3.3 数据透视
# 以hometown分组,统计每一组中的名字以列表的形式展示
db.stu.aggregate([{
  $group: {
    _id: "$hometown",
    "name_list":{$push: "$name"}
  }
}])

mongodb partition设置 mongodb aggregate limit_mongodb_03

4.$match

$match用于数据的过滤,类似于find(),但$match可以把结果交给下一个管道处理

# 查询年龄大于20, 以hometown分组, 统计数量
db.stu.aggregate([
  {
    $match:{age:{$gt:20}}
  },
  {
    $group: {
      _id: "$hometown",
      "counter": {$sum: 1}
    }
  }
])

mongodb partition设置 mongodb aggregate limit_字段_04

5.$project

$project类似于投影,可以控制字段的显示与隐藏

# 通过性别分组,统计人数,但最后只展示统计人数
db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$project:{_id:0,counter:1}}])

mongodb partition设置 mongodb aggregate limit_mongodb_05

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}
])

mongodb partition设置 mongodb aggregate limit_数据库_06