mongodb的map-reduce机制
1 含义: map-reduce:将大量工作分解(map)执行,将结果合并(reduce)
2 语法:
db.collection.mapReduce(
function() {emit(key, value);}, //map函数
function(key, values) { return reduceFunction}, //reduce函数
{
out: colletion,
query: document,
sort: document,
limit: number
}
)
map函数调用emit(key, value)遍历collection将key和value传递给reduce函数处理
map函数调用emit(key, value)返回键值对
map: 映射函数(生成键值对序列,作为reduce函数参数)
reduce: 统计函数,将key-value键值对变成key-value,本质就是用key分组,得到values,将values按照某种聚合
方法进行聚合,生成最终结果
out: 统计结果存放集合(不指定则使用临时,客户端断开后自动删除)
query: 筛选条件,满足条件的文档才会调用map函数
sort: 排序参数,发给map函数前给文档排序
limit: 发往map函数的文档数量上限
3 实际操作
use mydb;
db.orders.insert({'cust_id': 'A123', 'amount': 250, 'status': "A"});
db.orders.insert({'cust_id': 'B212', 'amount': 200, 'status': "A"});
db.orders.insert({'cust_id': 'A123', 'amount': 300, 'status': "D"});
db.orders.mapReduce(
function() {emit(this.cust_id, this.amount);},
function(key, values) {return Array.sum( values )},
{
query: { status: "A" },
out: "order_totals"
}
)
db.orders.mapReduce( function() {emit(this.cust_id, this.amount);}, function(key, values) {return Array.sum( values )}, { query: { status: "A" }, out: "order_totals" } )
输出:
{
"result" : "order_totals",
"timeMillis" : 182,
"counts" : {
"input" : 3,
"emit" : 3,
"reduce" : 1,
"output" : 2
},
"ok" : 1
}
查看临时输出结果集合
> show collections;
order_totals
orders
test_set
> db.order_totals.find()
{ "_id" : "A123", "value" : 750 }
{ "_id" : "B212", "value" : 200 }
转裁自
[1] http://www.runoob.com/mongodb/mongodb-map-reduce.html