数据库-mongodb-聚合与map reduce
2024-08-31 10:11:14
分组统计: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" }}},
]); |
查询每个栏目的商品平均价格,并按照平均价格由高到低排序
--这个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上
最新文章
- linQ学习笔记之一
- html特殊字符
- .oi 小游戏
- Ruby--String
- redis介绍【转】
- 对java框架的几点认识
- easyUI相关知识
- 关于 typedef &; typedef struct &; typedef union理解 --写给不长脑子的我
- 邮件发布google blogger 博客
- PHP的学习记录
- 51Nod 1003 阶乘后面0的数量(数学,思维题)
- bat执行python脚本,执行多条命令
- centos7.3配置python2、3环境与配置各自pip
- java十进制转换成二进制数
- php Pthread 线程 互斥锁
- dialog--not attached to window manager
- 关于Linux(时间网路同步)
- BZOJ1227或洛谷2154 [SDOI2009]虔诚的墓主人
- 【剑指offer】合并两个排序的链表
- 共识算法:Paxos
热门文章
- Strtus配置Tomcat出现问题2
- [SharePoint][SharePoint Designer 入门经典]Chapter8 XSLT数据试图和表单
- wordpress迁移以及遇到的一些问题[mysql备份导入导出][固定链接404]
- Android中的WiFi P2P
- JavaScript 获取小数任一小数点后的位数的小数
- java 递归实现删除或查询指定目录下的全部文件
- [总结]FFMPEG视音频编解码零基础学习方法【转】
- python中黏包现象
- UWP 开发APP准备工作
- JSTL教程 [JSP 标准标记库]