#MongoDb 聚合方法 group aggrate mapreduce#
1. Group (不支持分片,分布计算)
* 语法结构
<pre>
db.collection.group({
key:{category:1}, // 根据category来分类
cond:{shop_price:{$gt:20}}, // 附加条件商品借个大于20的商品
reduce:function(curr, result){ // curr 标识一行记录, result自定义变量,
},
initial:{total:0}, // 初始化变量,此处定义的变量可以在reduce方法中获取,result.total
finalize:function(result){ // 最后分组后,得到一个result,再对result进行处理
}
});
</pre>
* 处理max
<pre>
db.collection.group({
key:{category:1}, # 根据category来分类
cond:{}, # 附加条件商品借个大于20的商品
reduce:function(curr, result){ # curr 标识一行记录, result自定义变量,
if(curr > result.total)
$result.total = curr.shop_price;
},
initial:{total:0}, # 初始化变量,此处定义的变量可以在reduce方法中获取,result.total
finalize:function(result){ # 最后分组后,得到一个result,再对result进行处理
}
});
</pre>
* 处理avg
<pre>
db.collection.group({
key:{category:1}, # 根据category来分类
cond:{shop_price:{$gt:20}}, # 附加条件商品借个大于20的商品
reduce:function(curr, result){ # curr 标识一行记录, result自定义变量,
result.count += 1;
result.total += parseFloat(curr.shop_price);
},
initial:{total:0,count:0,avg:0}, # 初始化变量,此处定义的变量可以在reduce方法中获取,result.total
finalize:function(result){ # 最后分组后,得到一个result,再对result进行处理
result.avg = result.total / result.count;
}
});
</pre>
2. aggregate
* 语法结构
<pre>
db.collection.aggregate([
{},
{},
....,
]);
</pre>
* $group 类似sql中的select. 根据商品的cat_id、颜色分类, 然后求出分类的商品的库存量
<pre>
[
{$group:{ _id:{cat_id:"$cat_id", color:"$color"}, total:{$sum:"$goods_number"}}}
]
</pre>
* $project 类似sql中的select ,取出商品表的cat_id,goods_name,不去出_id字段
<pre>
[
{$project:{_id:0, cat_id:1, goods_name:1}}
]
</pre>
* $match 匹配条件 取出商品的分类id为3或者价格大于200元的商品
<pre>
[
{$math:{$or:[{cat_id:3}, {price:{$gt:200}}]}}
]
</pre>
* $unwind 分割字段,(字段必须是数组,否则报错)
<pre>
Data Model: shoes
{_id:1, feature:["man", "big", "black", "cheap"]}
Command:
db.shoes.aggregate([
{$unwind:"$feature"}
])
Output:
{_id:1,feature:"man"}
{_id:1,feature:"big"}
{_id:1,feature:"black"}
{_id:1,feature:"cheap"}
</pre>
* $redact [编辑条件](http://docs.mongodb.org/manual/reference/operator/aggregation/redact/#pipe._S_redact)
* $limit 限制条件 只取30条记录
<pre>
[
{$limit: 30}
]
</pre>
* $sort 排序 根据商品库存正序,1/正序 -1/倒序
<pre>
[
{$sort:{goods_number:1,}}
]
</pre>
* $geoNear [距离计算](http://docs.mongodb.org/manual/reference/operator/aggregation/geoNear/#pipe._S_geoNear)
* $skip 跳过行 跳过20行
<pre>
[
{$skip: 20}
]
</pre>
* $out 将匹配的结果输出到另外一个集合中, 将价格大于3000的商品取出 cat_id,goods_name,goods_number字段,不去出_id字段,然后按照商品的cat_id,color分类,结果跳过一行,只取30杭记录,把结果push到result集合中
<pre>
[
{$math:{goods_price:{$gte:3000}}},
{$project:{cat_id:1,goods_name:1, goods_number:1, _id:0}},
{$group:{_id:{cat_id:"$cat_id", color:"$color"}, total:{$sum:"$goods_number"}}},
{$skip:1},
{$limit:30},
{$out:"result"}
]
</pre>
3. mapReduce方法
* 语法结构
<pre>
db.collection.mapReduce(
function(){
emit(this.cat_id, this.goods_number);
}, // map方法
function(key,value){
return Array.sum(value);
}, // reduce方法
{
query:{goods_id:{$gt:30}},
out:"mapReduceResultSet"
}
);
</pre>
* [more information](http://docs.mongodb.org/manual/core/map-reduce/)