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