位置:首页 > 数据库 > MongoDB在线教程 > MongoDB Map Reduce

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的使用非常灵活强大。