MongoDB教程
+ -

MongoDB Map Reduce

2019-09-09 4 0

Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。

MapReduce 命令

以下是MapReduce的基本语法:

>db.collection.mapReduce(
   function() {emit(key,value);},  //map 函数
   function(key,values) {return reduceFunction},   //reduce 函数
   {
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value), 遍历
collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进行处理。

Map 函数必须调用 emit(key, value) 返回键值对。

参数说明:

  • map :映射函数 (生成键值对序列,作为 reduce 函数参数)。
  • reduce 统计函数,reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。。
  • out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
  • query 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
  • sort 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
  • limit 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)

以下实例在集合 orders 中查找 status:”A” 的数据,并根据 cust_id 来分组,并计算 amount 的总和。

使用 MapReduce

考虑以下文档结构存储用户的文章,文档存储了用户的 user_name 和文章的 status 字段:

>db.posts.insert({
   "post_text": "字节流,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "字节流,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "字节流,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "字节流,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "字节流,最全的技术文档。",
   "user_name": "mark",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "字节流,最全的技术文档。",
   "user_name": "bytekits",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "字节流,最全的技术文档。",
   "user_name": "bytekits",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "字节流,最全的技术文档。",
   "user_name": "bytekits",
   "status":"active"
})
WriteResult({ "nInserted" : 1 })

现在,我们将在 posts 集合中使用 mapReduce
函数来选取已发布的文章(status:”active”),并通过user_name分组,计算每个用户的文章数:

>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" : 23,
        "counts" : {
                "input" : 5,
                "emit" : 5,
                "reduce" : 1,
                "output" : 2
        },
        "ok" : 1
}

结果表明,共有 5 个符合查询条件(status:”active”)的文档, 在map函数中生成了 5
个键值对文档,最后使用reduce函数将相同的键值分为 2 组。

具体参数说明:

  • result:储存结果的collection的名字,这是个临时集合,MapReduce的连接关闭后自动就被删除了。
  • timeMillis:执行花费的时间,毫秒为单位
  • input:满足条件被发送到map函数的文档个数
  • emit:在map函数中emit被调用的次数,也就是所有集合中的数据总量
  • ouput:结果集合中的文档个数 ( count对调试非常有帮助)
  • ok:是否成功,成功为1
  • err:如果失败,这里可以有失败原因,不过从经验上来看,原因比较模糊,作用不大

使用 find 操作符来查看 mapReduce 的查询结果:

>db.posts.mapReduce( 
   function() { emit(this.user_name,1); },   function(key, values) {return Array.sum(values)},      {  
         query:{status:"active"},  
         out:"post_total"      }
).find()

以上查询显示如下结果,两个用户 tom 和 mark 有两个发布的文章:

{ "_id" : "mark", "value" : 4 }
{ "_id" : "bytekits", "value" : 1 }

用类似的方式,MapReduce可以被用来构建大型复杂的聚合查询。

Map函数和Reduce函数可以使用 JavaScript 来实现,使得MapReduce的使用非常灵活和强大。

0 篇笔记 写笔记

MongoDB 关系
MongoDB 的关系表示多个文档之间在逻辑上的相互联系。文档间可以通过嵌入和引用来建立联系。MongoDB 中的关系可以是:1:1 (1对1)1: N (1对多)N: 1 (多对1)N: N (多对多) 接下来我们来考虑下用户与用户地址的关系。一个用户可以有多个地址,所以是一对多的关系。以下是 u......
Perl POD 文档
Perl 中可以在模块或脚本中嵌入 POD(Plain Old Documentation) 文档。POD 是一种简单而易用的标记型语言(置标语言)。POD 文档使用规则:POD 文档以 =head1 开始, =cut 结束, =head1 前与 =cut 后添加一空行。Perl 会忽略 POD 中......
PHP 函数不定参数和默认参数
PHP作为一门弱化语言,支持c语言类似的不定参数和可选参数,只是格式书写格式不致,如:不定参数:使用函数fun_num_args()获取参数个数,使用fun_get_args()获取参数,指定索引则获取第内个参数,未指定索引指获取所有参数并生成数组返回。
XPath在要与XPath表达式一起使用的节点上定义以下运算符。序号Operator描述 1/用 于选择特定节点下的节点。 2//用 于从根节点选择节点 3[…]用 于检查节点值 4|用 于两个节点集的并集 XPath在要与XPath表达式一起使用的节点上定义以下功能。序号Ope......
函数是一起执行任务的一组语句,每个C程序都有至少一个函数,即 main(),所有最简单的程序都可以定义其他函数函数 declaration 告诉编译器函数的名称,返回类型和参数,函数定义提供函数的实际主体。C标准库提供了程序可以调用的许多内置函数。如, strcat()可以连接两个字符串, mem......
random() 方法返回随机生成的一个实数,它在[0,1)范围内。语法以下是 random() 方法的语法:import randomrandom.random()注 意:random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。参数无返回值返回随......
atan() 返回x的反正切弧度值。语法以下是 atan() 方法的语法:import mathmath.atan(x)注 意:atan()是不能直接访问的,需要导入 math 模块,然后通过 math 静态对象调用该方法。参数x — 一个数值。返回值返回x的反正切弧度值。实例以下展示了使用 ata......
degrees() 将弧度转换为角度。语法以下是 degrees() 方法的语法:import mathmath.degrees(x)注 意:degrees()是不能直接访问的,需要导入 math 模块,然后通过 math 静态对象调用该方法。参数x — 一个数值。返回值返回一个角度值。实例以下展示......
MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP。 在这些语言中,Mysql在PHP的web开发中是应用最广泛。在本教程中我们大部分实例都采用了 PHP 语言。如果你想了解 Mysql 在 PHP 中的应用,可以访问我们的 PHP教程。PHP提供了多种方式来访问和......
ios_event::eof()函数用于检查是否设置了eofbit。 当在与流相关联的序列达到文件结束时,通过所有标准输入操作来设置该标志。声明下面是eof()const函数的声明。bool eof() const;返回值如果设置流的eofbit错误状态标志(表示最后输入操作已经到达文件结束),则返......
什么是 XML?XML 指可扩展标记语言(eX tensible M arkup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 XML 教程XML 被设计用来传输和存储数据。XML 是一套定义语义标记的规则,这些标记将文档分成许多部......
如果要将一维数组作为参数传递给函数,则必须以下列三种方式之一声明函数形式参数,并且所有三种声明方法都会产生类似的结果,因为每个都告诉编译器接受一个整数指针。类似地,可以将多维数组作为形式参数传递。方式-1使用指针形式参数如下(在下一章学习指针的用法)。- (void) myFunction(int ......
max() 方法返回给定参数的最大值,参数可以为序列。语法以下是 max() 方法的语法:max( x, y, z, .... )参数x — 数值表达式。y — 数值表达式。z — 数值表达式。返回值返回给定参数的最大值。实例以下展示了使用 max() 方法的实例:#!/usr/bin/python......
什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>va......
PHP参数化函数是带有参数的函数。 您可以在函数中传递任意数量的参数。 这些传递的参数作为函数中的变量。它们在函数名称之后,在括号内指定。输出取决于作为参数传递到函数中的动态值。PHP参数化示例1 加减法在这个例子中,我们在两个函数add()和sub()中传递了两个参数$x和$y。 文件:para.......
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!