MongoDB学习(四)聚合

将信息收集汇总,进行统计操作,这样子的操作就称为聚合。

统计表里面的数据量

db.students.count();

消除重复数据可以使用distinct   ------   没有现成的函数,只能用底层的函数runCommand

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

使用底层的runCommand方法实现group的方法

db.runCommand({"group":{

    "ns":"students",

    "key":{"age":true},

    "initial":{"count":0},

    "condition":{"age":{"$gte":19}},

    "$reduce":function(doc,prev){

        prev.count++;

    }

}})

MapReduce是整个大数据的核心,实际的过程中会用聚合函数代替

Map:将整个数据分别去出来,

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

var jobMapFun = function(){

    emit(this.job,this.name)

}

var jobReduceFun = function(key,values){

    return {"job":key,"names":values}

}

db.runCommand({

    "mapreduce" : "emps",   //处理的集合

    "map":jobMapFun,

    "reduce":jobReduceFun,

    "out":"t_job_emps"  //输出结果集合

})

运行上述的代码,得到一个集合t_job_emps

如果需要对reduce处理完后的数据进行处理还可以加上一个finalize

var jobFinalizeFun= function(key,values){

    if (key == "president"){

        return {"job":key,"names":values,"info":"boss"}

    }else{

         return {"job":key,"names":values}

    }

}

db.runCommand({

    "mapreduce" : "emps",   //处理的集合

    "map":jobMapFun,

    "reduce":jobReduceFun,

    "finalize":jobFinalizeFun,

    "out":"t_job_emps"  //输出结果集合

})

运行上述代码得到结果

聚合函数aggregate

$group

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

求每个职位的人数

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

求每个职位的总工资

db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$avg":"$salary"}}}])

求每个职位的平均工资

db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$min":"$salary"}}}])

求每个职位的最小工资

db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$max":"$salary"}}}])

求每个职位的最大工资

db.emps.aggregate([{"$group":{"_id":"$job","job_sla":{"$max":"$salary"},"names":{"$push":"$name"}}}])

求出每个职员名称,如果需要去重的话使用addToSet

aggregate所有的分组数据的无序的,而且运行的数据是在内存中运行的,所以运行的数据量不会太多。

$project

普通列:({"成员":1|true})

"_id":({"_id":false|0})

筛选列({"成员":表达式})

db.emps.aggregate([{"$project":{"_id":0,"name":1,"sex":1}}])

project支持四则运算$add , $substract , $ multiply , $divide ,$mod

db.emps.aggregate([{"$project":{"_id":0,"name":1,"sex":1,"job":1,"salary":1,"年薪":{"$multiply":["$salary",12]}}}])

project支持关系运算$cmp比较大小 , $eq , $gt , $lt ,$gte ,$lte ,$ne ,$ifNull,返回的都是布尔值

project支持逻辑运算$and ,$or ,$not

project支持字符串操作$concat ,$substr ,$toLower ,$toUpper ,$strcasecmp

db.emps.aggregate([{"$project":{"_id":0,"name":1,"sex":1,"job":1,"salary":1,"年薪":{"$gte":["$salary",2000]}}}])

算出工资大于等于2000的员工

db.emps.aggregate([{"$project":{"_id":0,"name":1,"sex":1,"job":1,"salary":1,"职位":{"$strcasecmp":["$job","MANAGER"]}}}])

strcasecmp比较生成的是-1 ,0分别表示不等,相等

$sort

-1表示和1分别表示降序和升序

db.emps.aggregate([

    {"$match":{"salary":{"$gt":2000,"$lte":10000}}},

    {"$project":{"_id":0,"name":1,"salary":1,"job":1}},

    {"$group":{"_id":"$job","count":{"$sum":1}}},

    {"$sort":{"count":-1}}

])

查询出来的数据默认升序,我们加入降序的操作之后。查询出来的结果如下

$limit $skip

分页操作

db.emps.aggregate([

    {"$match":{"salary":{"$gte":2000,"$lte":10000}}},

    {"$project":{"_id":0,"name":1,"salary":1,"job":1}},

    {"$group":{"_id":"$job","count":{"$sum":1}}},

    {"$skip":1},

    {"$limit":1}

])

$unwind

查询数据的时候需要将数组返回成字符串,使用$unwind便可以生成字符串

$out将处理完成的数据输出到一个指定的集合

版权声明: 原创文章,如需转载,请注明出处。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值