热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在NodeJs中使用MongoDB中的MapReduce

MapReduce是一个编程模型,封装了并行计算、容错、数据分布、负载均衡等细节问题。输入是一个key-value对的集合,中间输出也是key-valu

   MapReduce是一个编程模型,封装了并行计算、容错、数据分布、负载均衡等细节问题。

   输入是一个key-value对的集合,中间输出也是key-value对的集合,用户使用两个函数:Map和Reduce。

   主要用来进行统计,有点像sql中的group  by但是比groupby功能更强大。

官网示例:http://mongodb.github.com/node-mongodb-native/api-generated/collection.html?highlight=mapreduce#mapReduce

   假设我们数据库现在存在四个数据如下:


我用NodeJs写了一段代码,如下:


得到的结果如下:


在NodeJs中使用MongoDB中的MapReduce
其中的_id就是对应的上面写的map中的key也就是age字段,

从统计结果可以看出gender为man的记录中age为20的有两个,age为23的有1个。

参数说明:

   mapreduce:要操作的目标集合。

   map: 映射函数 (生成键值对序列,作为 reduce函数参数)。

   reduce:统计函数。

   query: 一个筛选条件,只有满足条件的行才会加入mapreduce集合,而这个筛选过程是先于整个mapreduce流程而执行的

   sort: 和query结合的sort排序参数(需要排序的参数必须先建立索引:db.wiki.ensureIndex({title:1}))

   limit:限制目标记录数量。

   out: 结果输出的collection的名字 (不指定则使用临时集合,在客户端断开后自动删除。replace、merge、reduce、inline)。参考:http://www.mongodb.org/display/DOCS/MapReduce

   keeptemp: true或false,表明结果输出到的collection是否是临时的,如果为true,则会在客户端连接中断后自动删除,如果你用的是MongoDB的mongo客户端连接,那必须exit后才会删除。如果是脚本执行,脚本退出或调用close会自动删除结果collection

   finalize: 和map,reduce一样是一个函数,它可以在reduce得出一个结果后再对key和value进行一次计算并返回一个最终结果。参考上面的示例

   scope: 设置参数值,在这里设置的值在map,reduce,finalize函数中可见

   verbose:在执行过程中的调试信息

使用out参数时要注意当使用inline时文档的数据不能太大,否则返回结果将出现错误,官网说明如下: Notethat this option is possible only when the result set fits withinthe 16MB limit of a single document.


如果verbose:true的时候callback返回中多一个stats字段:



返回结果参数如下:

  • result:储存结果的collection的名字
  • input:满足条件的数据行数
  • emit:emit调用次数,也就是所有集合中的数据总量
  • ouput:返回结果条数
  • timeMillis:执行时间,毫秒为单位
  • ok:是否成功,成功为1
  • err:如果失败,这里可以有失败原因,原因一般比较模糊,作用不大

使用scope参数我们可以在map、reduce、finalize中引入外界函数或变量:

参考官网教程:mapReduce

在NodeJs中使用MongoDB中的MapReduce



注意:我在使用中发现当我们map中的value为单个字符,而reduce返回的为json的时候会出现异常,且reduce中的value值中字段的数目不相等也会出现异常。所以:

   1、如果reduce返回的是json格式数据的时候map中的value也得是json格式的

   2、map和reduce中的value值中字段的数目必须相等


如上图中的情况,得到的结果将出现异常

在NodeJs中使用MongoDB中的MapReduce


下面我们看一个例子巩固下上面的知识:

我先往数据库插入一些数据:health/routes/add.js

数据结构是这样的:

{"name":"张三","age":58,"gender":"男","birthday":"1905-12-09","mobile":"15815222297","note":"北京"}
我们现在来统计下刚刚插入的数据的姓名中一共有多少个姓,每个姓有多少人

所以统计的结构应该是这样的:key就是姓,然后value中是统计的人数


先写map函数:(在map中我们取出每个collections名字中的姓)

var map = function () {vara=this.name.substring(0,1);emit(a, {count:1}); //map时姓相同的为一组传给reduce,传的值中key为name中的姓
};

然后再写一个reduce处理函数:(统计每个姓的人数)

var reduce = function (key, values) {var x = 0;values.forEach(function (v){x += v.count;});return{count:x};//统计出每个姓一共有多少人
};

然后我们用finalize函数根据统计的结果給每个姓写一个comment:

functionfinalize(key,rval){returncomment(rval);
}

其中comment函数是我从外界引入的所以需要在scope中申明一下 

function comment(input){if(input.count>100){input.comment="该姓人数较多!"}return input;
}

然后开始执行统计函数: health/routes/mapReduces

testProvider.mapReduce(map, reduce, {out:{replace:'tempCollection'},scope:{comment:newCode(comment.toString())},finalize:finalize,verbose:true},function (err,collection, stats) {})

然后得出统计结果和统计时的资源使用情况:






推荐阅读
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • 本文将深入探讨MySQL与MongoDB在游戏账户服务中的应用特点及优劣。通过对比这两种数据库的性能、扩展性和数据一致性,结合实际案例,帮助开发者更好地选择适合游戏账户服务的数据库方案。同时,文章还将介绍如何利用Erlang语言进行高效的游戏服务器开发,提升系统的稳定性和并发处理能力。 ... [详细]
  • 掌握 MongoDB 基础操作与实用技巧 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 通过利用代码自动生成技术,旨在减轻软件开发的复杂性,缩短项目周期,减少冗余代码的编写,从而显著提升开发效率。该方法不仅能够降低开发人员的工作强度,还能确保代码的一致性和质量。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案
    MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 本课程首先介绍了全栈开发的最后一公里为何重要,并详细探讨了搭建线上生产环境的关键步骤。随后,通过五个本地Node.js项目的实战演练,逐步展示了从快速构建纯静态简易站点到复杂应用的全过程,涵盖了环境配置、代码优化、性能调优等多方面内容。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
author-avatar
mobiledu2502917953
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有