根据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
请考虑存储用户帖子的以下文档结构。 该文档存储用户的user_name
和帖子的状态(status
)。
{
"post_text": "yiibai tutorials is an awesome website for tutorials",
"user_name": "maxsu",
"status":"active"
}
现在,我们将在posts
集上使用mapReduce
函数来选择所有status
的值为active
的帖子,并根据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
)匹配,映射函数发出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
和 maxsu
有两个活动状态的帖子 –
{ "_id" : "tom", "value" : 2 }
{ "_id" : "maxsu", "value" : 2 }
以类似的方式,MapReduce
查询可用于构建大型复杂聚合查询。 使用自定义JavaScript函数可以使用MapReduce,它非常灵活和强大。