MongoDB 数据操作(八)聚合框架(1)$group
in SQL with 0 comment, Views is 15

MongoDB 数据操作(八)聚合框架(1)$group

in SQL with 0 comment, Views is 15

上一篇:《MongoDB 数据操作(七)聚合(4)MapReduce》

MapReduce 功能强大,然而它的复杂度和功能一样强大

很多时候我们需要 MapReduce 的功能,可是又不想把代码写得太复杂

于是从 MongoDB 2.x 版本之后开始引入了聚合框架,并且提供了聚合函数:aggregate()

group 主要进行分组的数据操作

求出每个职位的雇员人数

> db.emps.aggregate([{"$group":
      {"_id": "$job", "count": {"$sum": 1}}
  }]);

1.png

这样的操作更加符合于传统的 group by 子句的操作使用

求出每个职位的总工资

> db.emps.aggregate([{"$group":
      {
          "_id": "$job",
          "salary": {"$sum": "$salary"}
      }
  }]);

2.png

在整个聚合框架里面如果要引用每行的数据可以使用:$字段名称

计算出每个职位的平均工资

> db.emps.aggregate([{"$group":
      {
          "_id": "$job",
          "sal": {"$sum": "$salary"},
          "avg": {"$avg": "$salary"}
      }
  }]);

3.png

求出最高、最低工资

> db.emps.aggregate([{"$group":
      {
          "_id": "$job",
          "sal": {"$sum": "$salary"},
          "avg": {"$avg": "$salary"},
          "max": {"$max": "$salary"},
          "min": {"$min": "$salary"}
      }
  }]).pretty();

4.png

以上的几个与 SQL 类似的操作计算就成功的实现了

计算出每个职位的工资数据(数组显示)

> db.emps.aggregate([{"$group":
      {
          "_id": "$job",
          "sal_data": {"$push": "$salary"}
      }
  }]).pretty();

5.png

显示每个职位的人员

> db.emps.aggregate([{"$group":
      {
          "_id": "$job",
          "names": {"$push": "$name"}
      }
  }]).pretty();

6.png

使用 $push 的确可以将数据变成数组形式保存,但是重复的内容也会进行保存

在 MongoDB 中有取消重复的设置

显示每个职位的人员(取消重复)

> db.emps.aggregate([{"$group":
      {
          "_id": "$job",
          "names": {"$addToSet": "$name"}
      }
  }]).pretty();

7.png

默认情况下是将所有的数据都保存,但是现在只希望可以保留第一个或者是最后一个数据

保存第一个内容

> db.emps.aggregate([{"$group":
      {
          "_id": "$job",
          "name": {"$first": "$name"}
      }
  }]).pretty();

8.png

保存最后一个内容使用 $last

虽然可以方便的实现分组处理,但是有一点需要注意,所有的分组数据都是无序的,并且都是在内存之中完成

因此不可能支持大数据量

下一篇:《MongoDB 数据操作(八)聚合框架(2)$project》

Responses
选择表情