#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/)