MongoDB Map Reduce
按 MongoDB 的文档介绍,Map-reduce是一种数据处理大数据转化为有用的汇总结果。MongoDB使用MapReduce命令,map-reduce操作符。MapReduce一般用于处理大数据集。
MapReduce 命令:
以下是基本的MapReduce命令的语法:
>db.collection.mapReduce( function() {emit(key,value);}, //map function function(key,values) {return reduceFunction}, //reduce function { out: collection, query: document, sort: document, limit: number } )
map-reduce函数第一个查询集合,然后映射结果文档发出键 - 值对,然后减少基于多个值的键。
在上面的语法:
- map 是一个JavaScript函数映射一个带有关键字的值,并发出一个键值对
- reduce 是一个javscript函数减少或组中具有相同的密钥的所有文档
- out 指定map-reduce查询结果的位置
- query 指定可选的选择标准来选择文档
- sort 指定可选的排序标准
- limit 指定要返回文档的可选最大数量
使用MapReduce:
考虑下面的文档结构存储用户的帖子。用户的文档存储user_name和帖子的状态。
{ "post_text": "yiibai is an awesome website for tutorials", "user_name": "mark", "status":"active" }
现在,我们将使用MapReduce函数在我们的帖子集合,来选择所有活动的帖子,分组它们在user_name的基础上再上计数,使用下面的代码计算每个用户帖子的数量:
>db.posts.mapReduce( function() { emit(this.user_id,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
上述的 MapReduce 查询输出以下结果:
{ "result" : "post_total", "timeMillis" : 9, "counts" : { "input" : 4, "emit" : 4, "reduce" : 2, "output" : 2 }, "ok" : 1, }
结果表明,共有4个符合查询的文档(status:"active"),map函数发出4个文档带键值对,最后是减少函数分组映射文档具有相同的键进入2。
若要查看 MapReduce 的查询结果,那么使用 find 操作符:
>db.posts.mapReduce( function() { emit(this.user_id,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
上面的查询提供了以下结果,表明这两个用户tom和mark在活跃状态的两个帖子:
{ "_id" : "tom", "value" : 2 } { "_id" : "mark", "value" : 2 }
类似的方式,MapReduce查询可以被用来构造大型复杂聚集的查询。 使用自定义的JavaScript函数,使MapReduce的使用非常灵活强大。