group({
key:{key1:1,key2:1}, 對篩選後的數據根據key1,key2進行分組
cond:{},根據哪些條件進行篩選數據
reduce:function(curr,res){}, 每一行curr變一次,每個分組res變一次
initial:{},對每個分組中的臨時變量進行初始化
finalize:function(){} 對最終的res進行其他操作,如:求平均。
})
==============建表,插數據===================================
----mongo---
db.goods.insert([
{cat_id:2,goods_name:"Nokia",price:900},
{cat_id:3,goods_name:"iPhone6",price:5600},
{cat_id:3,goods_name:"Mac",price:7800},
{cat_id:3,goods_name:"iPhone7",price:7700},
{cat_id:3,goods_name:"iPad mini",price:4500},
{cat_id:4,goods_name:"SanSong",price:890},
{cat_id:4,goods_name:"JinLi",price:550}
{cat_id:5,goods_name:"Meizu1",price:890},
{cat_id:5,goods_name:"Meizu-Note",price:2300},
])
---mysql---
create table goods(
cat_id int(10) NOT NULL ,
goods_name varchar(100),
price int(10),
Primary KEY cat_id_goods_name(cat_id,goods_name)
);
insert into goods values
(2,"Nokia",900),
(3,"iPhone6",5600),
(3,"Mac",7800),
(3,"iPhone7",7700),
(3,"iPad mini",4500),
(4,"SanSong",890),
(4,"JinLi",550);
(5,"Meizu1",890),
(5,"Meizu-Note",2300);
=============group by cat_id============================
案例1:根據類目cat_id進行分組,並顯示每個分組的數量
---mysql---
select cat_id,count(1) from goods group by cat_id order by cat_id;
---mongo---
db.goods.group({
key:{cat_id:1},
cond:{},
reduce:function(curr,res){res.cnt+=1},
initial:{cnt:0},
});
========= ==where price>=900====== =======================
案例2:篩選出價格大於900的數據,再根據類目cat_id進行分組,並顯示每個分組的數量
---mysql---
select cat_id,count(1) from goods where price>=900 group by cat_id;
---mongo---
db.goods.group({
key:{cat_id:1},
cond:{price:{$gte:900}},
reduce:function(curr,res){res.cnt+=1},
initial:{cnt:0},
});
=========== =====sum(price)===== ===========================
案例3:根據cat_id分組,展示每個分組下總價格
---mysql---
select sum(price) from goods group by cat_id;
---mongo---
db.goods.group({
key:{cat_id:1},
cond:{},
reduce:function(curr,res){res.totalPrice += curr.price},
initial:{totalPrice:0}
});
=================max(price)===== ==========================
案例4:根據cat_id分組,展示每個分組下價格最高的記錄
---mysql---
select cat_id,max(price) from goods group by cat_id;
---mongo---
db.goods.group({
key:{cat_id:0},
cond:{},
reduce:function(curr,res){
if(curr.price > res.maxPrice)
res.maxPrice=curr.price
},
initial:{maxPrice:0}
});
======== =====avg(price)===== ============================
案例5:根據cat_id分組,展示每個分組的平均價格
---mysql---
select cat_id,avg(price) from goods group by cat_id;
---mongo---
db.goods.group({
key:{cat_id:1},
cond:{},
reduce:function(curr,res){
res.sumPrice+=curr.price;
res.cnt+=1;},
initial:{sumPrice:0,cnt:0},
finalize:function(res){res.avg = res.sumPrice/res.cnt;},
});
============================================================
tips:
1,group需要手寫聚合函數
2,group 不支持分片、集羣,不支持分佈式計算
3,分佈式:aggregate(),mapReduce()