分组统计:group()

简单聚合:aggregate()
强大统计:mapReduce()

Group函数:

1.不支持集群、分片,无法分布式计算

2.需要手写聚合函数的业务逻辑


curr指当前行,每更改一行,curr会变

result指的是当前组,每更改一组,result会变,返回的就是result的参数

查询每个栏目下的商品数量
1
2
3
4
5
6
7
8
db.goods.group({
key:{cat_id:1},
cond:{},
reduce:function(curr,result){
     result.cnt +=1;
},
initial:{cnt:0}
});

查找每个栏目下商品价格大于50的商品数量

1
2
3
4
5
6
7
8
db.goods.group({
key:{cat_id:1},
cond:{shop_price:{$gt:50}},
initial:{cnt:0},
reduce:function(curr,result){
     result.cnt +=1;
}
});

每个栏目下的商品库存量sum操作

1
2
3
4
5
6
7
8
db.goods.group({
key:{cat_id:1},
cond:{},
initial:{cnt:0},
reduce:function(curr,result){
     result.num += curr.goods_number;
}
});

计算每个栏目下最贵的商品,实现max()函数

1
2
3
4
5
6
7
8
9
10
db.goods.group({
key:{cat_id:1},
cond:{},
initial:{max:0},
reduce:function(curr,result){
     if(curr.shop_price > result.max ){
          result.max = curr.shop_price;    
     }
}
});

计算每个栏目下商品 的平均价格cu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
db.goods.group({
key:{cat_id:1},
cond:{},
initial:{cnt:0,sum:0},
reduce:function(curr,result){
     if(curr.shop_price > result.max ){
           result.cnt += 1;
           result.sum += curr.shop_price;
     }
},
  
finalize:function(result){
     result.avg = result.sum / result.avg;
}
});

aggregate()函数

where $match
group by  $group
having $match
select $project
order by  $sort
limit $limit
sum() $sum
count() $sum

查询每个栏目下的商品数量

1
2
3
db.collection.aggreagte([
{$group:{_id:"$cat_id",total:{$sum:1}}}
]);

查询goods下有多少商品

1
2
3
db.collection.aggreagte([
{$group:{_id:null,total:{$sum:1}}}
]);

查询每个栏目下价格大于50的商品,并筛选出“满足条件的商品数量大于等于3”的栏目

match在group前是SQL中match的作用,match在group后是having的作用

1
2
3
4
5
db.collection.aggreagte([
{$match:{shop_price:{$gt:50}}},
{$group:{_id:null,total:{$sum:1}}},
{$match:{total:{$gte:3}}},
]);

查询每个栏目下的库存量,并按照库存量排序

1
2
3
4
db.collection.aggreagte([
{$group:{_id:"$cat_id",total:{$sum:"$goods_number"}}},

{$sort:{total:1}}}, // 这个1表示正序排列,-1表示倒序排列

{$limit:4}   // 只取前四个

]);

查询每个栏目的商品平均价格,并按照平均价格由高到低排序

--这个group有不少参数,官方文档里面有

1
2
3
4
db.collection.aggreagte([
{$group:{_id:"$cat_id",avg:{$avg:"$shop_price"}}}, //$符号是转为列的意思
{$sort:{avg:1}}}
]);

MapReduce

mapReduce随着大数据的概念而流行

其实mapReduce的概念非常简单

从功能上来说,相当于RDMS的group操作

它的真正强项在于分布式,当数据非常大时,分布在各个地方时,group就力不能及了,mapReduce用蛮力来计算,mapReduce工作过程

map-->映射,先把同一个组的数据,映射到一个数组上

reduce-->规约,把数组进行运算

简单用法

1
2
3
4
5
var map = function(){
        emit(this.cat_id,this.shop_price);
}
var reduce = function(cat_id,all_price){XX各种数据操作};
db.goods.mapReduce(map,reduce,{quer:{},out:'res'});  //把查询到的结果输出为res表

mongodb对js的引擎做了一些修改对array数组增加了一些函数

mapReduce一般写在mongos上

数据库-mongodb-聚合与map reduce的更多相关文章

  1. 数据库——MongoDB——>Java篇

         MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.      MongoDB  是一个介于关系数据库和非关系数据库之间的产 ...

  2. 非关系型数据库----MongoDB

    一.什么是MongoDB? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提 ...

  3. python数据库-MongoDB的安装(53)

    一.NoSQL介绍 1.什么是NoSQL NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL". NoSQL,指的是非关系型的数据库.NoSQL有时也称 ...

  4. MongoDB Map Reduce(转载)

    MongoDB Map Reduce Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE). MongoDB提供的Map ...

  5. 记一次MongoDB Map&Reduce入门操作

    需求说明 用Map&Reduce计算几个班级中,每个班级10岁和20岁之间学生的数量: 需求分析 学生表的字段: db.students.insert({classid:1, age:14, ...

  6. mongodb Map/reduce测试代码

    private void AccountInfo() { ls.Clear(); DateTime dt = DateTime.Now.Date; IMongoQuery query = Query& ...

  7. Mongodb学习笔记四(Mongodb聚合函数)

    第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...

  8. MongoDB 聚合 (转) 仅限于C++开发

    MongoDB除了基本的查询功能,还提供了很多强大的聚合工具,其中简单的可计算集合中的文档个数, 复杂的可利用MapReduce做复杂数据分析. 1.count count返回集合中的文档数量 db. ...

  9. Mongodb聚合函数

    插入 测试数据 for(var j=1;j<3;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, Age: ...

随机推荐

  1. 计算机网络系统--TCP/IP OSI模型

  2. codevs——T1576 最长严格上升子序列

    http://codevs.cn/problem/1576/  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  3. IP协议解读(三)

    今天我们来介绍网络层中的ICMP协议 ICMP报文格式 图一: 从图片上我们能够分析出.前三位的字段都是固定的.8位类型字段,8位代码字段.16位校验和字段.其它字段因ICMP报文类型不同而不同.8位 ...

  4. Bootstrap警告

    警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 警告(Alerts) 步骤: 1.创建一个 <div> 2.并向其加入一个 .alert ...

  5. python2.7编码与解码

    常见的编码 ASCII: 美国人发明的,只编码英文字母和符号,1个字节. GB2312: 中国人发明的,增加了中文汉字和符号,2个字节. Unicode: 为了把所有语言都统一到一套编码里,一般是2个 ...

  6. SpringMVC-Interceptor拦截Session登录

    背景: 开发的项目都须要账号password登录才干够查看站点的内容,所以我们设计时须要考虑,用户进入站点仅仅能从一个我们设计的规范通道进入即通过注冊的账号password登录,其它方法都是非法的和不 ...

  7. Spark SQL Catalyst源代码分析之Analyzer

    /** Spark SQL源代码分析系列文章*/ 前面几篇文章解说了Spark SQL的核心运行流程和Spark SQL的Catalyst框架的Sql Parser是如何接受用户输入sql,经过解析生 ...

  8. ANT公布SVN WEB项目到TOMCAT以及利用post-commit自己主动提交编译更新

    开发者在本地提交更新到SVNserver后.往往须要測试人员又一次測试.为了将更新内容即时反映到測试server.能够利用post-commit脚本将SVN更新同步到測试server中. (1)利用S ...

  9. Swift - 判断是否有某功能访问权限,没有则提示,并自动跳转到设置页

    由于 iOS 系统的安全限制,App 如果需要访问设备的通讯录.麦克风. 相册. 相机.地理位置等时,需要请求用户是否允许访问.   有时用户不小心点了“不允许”,后面可能就不知道要去哪里再开启这个权 ...

  10. 升级Xcode8后的相机crash问题-IOS10权限问题

    当我升级到Xcode8后,启动我的相机项目,直接crash,输出的日志如下: '2016-07-08 16:41:11.268943 project-name[362:56625] [MC] Syst ...