扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

创新互联建站2013年至今,公司以做网站、网站设计、系统开发、网络推广、文化传媒、企业宣传、平面广告设计等为主要业务,适用行业近百种。服务企业客户1000多家,涉及国内多个省份客户。拥有多年网站建设开发经验。为企业提供专业的网站建设、创意设计、宣传推广等服务。 通过专业的设计、独特的风格,为不同客户提供各种风格的特色服务。
在 MongoDB 中我们可以使用 mapReduce 命令来执行 mapReduce 操作。
在 mapReduce 命令中要实现两个函数,分别是 map 函数和 reduce 函数,其中 map 函数调用 emit(key, value),遍历集合中的所有记录,并将 key 与 value 传递给 reduce 函数进行处理,如下所示:
> db.collection_name.mapReduce(
function() {emit(key, value);}, // map 函数
function(key, values) {return reduceFunction}, // reduce 函数
{
out: collection,
query: document,
sort: document,
limit: number
}
)
参数说明如下:
假如有一个存储用户帖子信息的集合,其中存储了若干用户的用户名、状态等信息,例如下面这样:
{
"post_text": "编程帮(biancheng.net),一个在线学习编程的网站,专注于分享优质编程教程。",
"user_name": "bianchengbang",
"status":"active"
}
接下来在上述的集合中使用 mapReduce 命令来选择集合中所有
"status":"active" 的文档,然后根据用户名对它们进行分组,最后统计每个用户的发帖数量。示例代码如下:
> db.posts.mapReduce(
... function() { emit(this.user_name,1); },
... function(key, values) {return Array.sum(values)},
... {
... query:{status:"active"},
... out:"post_total"
... }
... )
上面 mapReduce 命令的输出结果如下所示:
{
"result" : "post_total",
"timeMillis" : 48,
"counts" : {
"input" : 11,
"emit" : 11,
"reduce" : 2,
"output" : 2
},
"ok" : 1
}
关于运行结果,有如下几点需要说明:
通过运行结果可以发现,共有 11 个文档与查询匹配(状态为“active”),map 函数生成了 11 个具有键值对的文档,最后 reduce 函数将具有相同键值的映射文档分为 2 个组。
若要查看 mapReduce 查询的结果,可以使用 find 方法,如下所示:
> db.posts.mapReduce(
... function() { emit(this.user_name,1); },
... function(key, values) {return Array.sum(values)},
... {
... query:{status:"active"},
... out:"post_total"
... }
... ).find()
上面的查询语句,执行结果如下:
{ "_id" : "biancheng", "value" : 5 }
{ "_id" : "bianchengbang", "value" : 6 }
以类似的方式,mapReduce 查询可用于构造大型复杂的聚合查询,自定义 JavaScript 函数的使用使得 mapReduce 非常灵活和强大。

我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流