MongoDB聚合操作 (group, aggregate, mapReduce操作)
#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/)