《快速掌握 MongoDB 数据库(五)》笔记-阿里云大学

7、聚合(重点)

MongoDB的产生背景是在大数据环境,所谓的大数据实际上也就是进行信息的收集汇总。FlashCookie了解一下。那么就必须存在有信息的统计操作,而这样的统计操作就称为聚合(直白:分组统计就是一种聚合操作)

7.1、取得集合的数据量

对于集合的数据量而言,在MongoDB里面直接使用count()就可以完成。

范例:统计student集合中的数据量

db.student.count();

范例:模糊查询

db.student.count({"name":/张/i});

在进行信息查询的时候,不设置条件永远要比设置条件的查询快很多,也就是说在之前的代码编写里面不管是查询全部还是模糊查询,实际上最终都使用的是模糊查询一种(没有设置关键字)。记得以后如果是全集合查询,就不要带关键字了。

7.2、消除重复数据

在学习SQL的时候对于重复的数据可以使用“DISTINCT”,那么这一操作在MongoDB之中依然支持。

先在student集合中插入一个重复的name信息,如果有索引先删除掉

db.student.insert({"name":"张三","sex":"女","age":22,"score":100,"address":"房山区"});

范例:查询所有name的信息

      本次的操作没有直接的函数支持,只能够利用runCommand()函数。

db.runCommand({"distinct":"student","key":"name"})

此时实现了对于name数据的重复值的筛选。

7.3、group操作

使用group操作可以实现数据的分组操作,在MongoDB里面会将集合依据指定的key的不同进行分组操作,并且每一个组都会产生以处理的文档结果。

范例:查询所有年龄大于等于19岁的学生信息,并且按照年龄分组

db.runCommand({"group":{
    "ns":"student",
    "key":{"age":true},
    "initial":{"count":0},
    "condition":{"age":{"$gte":19}},
    "$reduce":function(doc,prev){
        prev.count++; //标识数量+1
    }
}})

以上的操作代码里面实现的就属于一种MapReduce,但是这样只是根据传统的数据库设计思路实现了一个所谓的分组操作,但是这个分组操作的最终结果是有限的(比如想搞个平均值就比较麻烦)。这种写法后续用的不多,但是这是开启聚合的第一步。

7.4、MapReduce

MapReduce是整个大数据的精髓所在(实际中别用),所谓的MapReduce就是分为两步处理数据:

      Map:将数据分别取出

      Reduce:负责数据的最后的处理。

可是要想在MongoDB里面实现MapReduce处理,那么复杂度是相当高的。

范例:建立一组雇员数据:

db.emps.insert({"name":"张三","age":30,"sex":"男","job":"CLERK","salary":1000});
db.emps.insert({"name":"李四","age":28,"sex":"女","job":"CLERK","salary":5000});
db.emps.insert({"name":"王五","age":26,"sex":"男","job":"MANAGER","salary":6000});
db.emps.insert({"name":"赵六","age":32,"sex":"女","job":"MANAGER","salary":7000});
db.emps.insert({"name":"孙七","age":31,"sex":"男","job":"CLERK","salary":2000});
db.emps.insert({"name":"王八","age":35,"sex":"女","job":"PRESIDENT","salary":9000});

使用MapReduce操作最终会将处理结果保存在一个单独的集合里面,而最终的处理效果如下:

范例:按照职位分组,取得每个职位的人名

第一步:编写分组的定义:

var jobMapFun=function(){
    emit(this.job,this.name);    //按照job分组,取出name
};

第一组:{key:"CLERK", values: [姓名,姓名,...]}

第二步:编写reduce操作:

var jobR
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值