MongoDB分组查询练习

MongoDB的分组查询需要使用db.collectionName.group(查询表达式)

Group大约需要一下几个参数。

 1.key:用来分组文档的字段。和keyf两者必须有一个
 2.keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
 3.initial:reduce中使用变量的初始化
 4.reduce:执行的reduce函数。函数需要返回值。
 5.cond:执行过滤的条件。
 6.finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的。

具体练习如下(只列出查询表达式):

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

{
key:{cat_id:1},
cond:{},
reduce:function(curr,result) {
    result.cnt += 1;
},
initial:{cnt:0}
}


#查询每个栏目下价格高于50元的商品数量

{
key:{cat_id:1},
cond:{shop_price:{$gt:50}},
reduce:function(curr,result) {
    result.cnt += 1;
},
initial:{cnt:0}
}

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

{
key:{cat_id:1},
cond:{},
reduce:function(curr,result) {
    result.num += curr.goods_number;
},
initial:{num:0}
}


#查询每个栏目最贵的商品价格, max()操作

{
key:{cat_id:1},
cond:{},
reduce:function(curr , result) {
    if(curr.shop_price > result.max) {
        result.max = curr.shop_price;
    }
},
initial:{max:0}
}


#查询每个栏目下最便宜的商品价格

#由于商品价格通常是非负数,所以可以将min标记为-1作为魅族首次的记录
{
key:{cat_id:1},
cond:{},
reduce:function(curr , result) {
	if(result.min==-1){
		result.min=curr.shop_price;
		
	}else{
		if(curr.shop_price < result.min) {
			result.min = curr.shop_price;
		}
	} 
},
initial:{min:-1}
}

#查询每个栏目下商品的平均价格

{
key:{cat_id:1},
cond:{},
reduce:function(curr , result) {
    result.cnt += 1;
    result.sum += curr.shop_price;
},
initial:{sum:0,cnt:0},
finalize:function(result) {
    result.avg = result.sum/result.cnt;
}
}

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

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

#查询goods下有多少条商品,select count(*) from goods
[
{$group:{_id:null,total:{$sum:1}}}
]


#查询每个栏目下 价格大于50元的商品个数

[
{$match:{shop_price:{$gt:50}}},
{$group:{_id:"$cat_id",total:{$sum:1}}}
]


#查询每个栏目下 价格大于50元的商品个数
#并筛选出"满足条件的商品个数" 大于等于3的栏目 

[
{$match:{shop_price:{$gt:50}}},
{$group:{_id:"$cat_id",total:{$sum:1}}},
{$match:{total:{$gte:3}}}
]

#查询每个栏目下的库存量

[
{$group:{_id:"$cat_id" , total:{$sum:"$goods_number"}}},
]


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

[
{$group:{_id:"$cat_id" , total:{$sum:"$goods_number"}}},
{$sort:{total:1}}
]


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

[
{$group:{_id:"$cat_id" , total:{$sum:"$goods_number"}}},
{$sort:{total:1}},
{$limit:3}
]


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

[
{$group:{_id:"$cat_id" , avg:{$avg:"$shop_price"}}},
{$sort:{avg:-1}}
]


mapReduce 随着"大数据"概念而流行.
其实mapReduce的概念非常简单,
从功能上说,相当于RDBMS的 group 操作

mapReduce的真正强项在哪?
答:在于分布式,当数据非常大时,像google,有N多数据中心,
数据都不在地球的一端,用group力所不及.

group既然不支持分布式,单台服务器的运算能力必然是有限的.

而mapRecuce支持分布式,支持大量的服务器同时工作,
用蛮力来统计.

mapRecuce的工作过程:
map-->映射
reduce->归约


map: 先是把属于同一个组的数据,映射到一个数组上.cat_id-3 [23,2,6,7]
reduce: 把数组(同一组)的数据,进行运算.


用mapReduce计算每个栏目的库存总量
map函数

var map = function() {
    emit(this.cat_id,this.goods_number);
    }


var reduce = function(cat_id,numbers) {
    return Array.sum(numbers);
}

db.goods.mapReduce(map,reduce,{out:'res'});

#用mapReduce计算每个栏目下商品的平均价格

var map = function() {
    emit(this.cat_id,this.shop_price);
    }


var reduce = function(cat_id,values) {
    return Array.avg(values);
}


db.goods.mapReduce(map,reduce,{out:'res'});

 

转载于:https://my.oschina.net/liuyuantao/blog/738688

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值