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 是一个javascript函数,它减少或分组具有相同键的所有文档
-
out 指定map-reduce查询结果的位置
-
query 指定可选的选择条件以选择文档
-
sort 指定可选的排序条件
-
limit 指定可选的返回的最大文档数
使用MapReduce
考虑以下存储用户帖子的文档结构。文档存储用户的用户名称和帖子的状态。
{
"post_text": "tutorialspoint is an awesome website for tutorials",
"user_name": "mark",
"status":"active"
}
现在,我们将在我们的 posts 集合上使用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个带有键值对的文档,最后reduce函数将具有相同键的映射文档分组成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功能。