MongoDB Map Reduce

news2024/11/16 5:41:01

在用 MongoDB 查询时,若返回的数据量很大,或者做一些比较复杂的统计和聚合操作做花费的时间很长时,可以使用 MongoDB 中的 mapReduce 进行实现。mapReduce 是个灵活且强大的数据聚合工具,它的好处是可以把一个聚合任务分解为多个小的任务,分配到多个服务器上并行处理。

在 MongoDB 中我们可以使用 mapReduce 命令来执行 mapReduce 操作。

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 函数参数)。
  • query 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
  • sort 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
  • reduce 统计函数,reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。。
  • out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
  • 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": "runoob",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "菜鸟教程,最全的技术文档。",
   "user_name": "runoob",
   "status":"disabled"
})
WriteResult({ "nInserted" : 1 })
>db.posts.insert({
   "post_text": "菜鸟教程,最全的技术文档。",
   "user_name": "runoob",
   "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被调用的次数,也就是所有集合中的数据总量
  • output:结果集合中的文档个数(count对调试非常有帮助)
  • ok:是否成功,成功为1
  • err:如果失败,这里可以有失败原因,不过从经验上来看,原因比较模糊,作用不大

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

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

以上查询显示如下结果:

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式(三)----创建型模式之单例模式(一)

一、创建型模式 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。 创建型模式分为: 单例模式 工厂方法模式 抽象工厂模式…

英语学习 3

1 词汇积累 1、ships 船 2、class 级 3、marvels 奇迹 4、marvelous 非凡的、了不起的、极好的 5、cursed 诅咒、被诅咒的 6、the most luxurious ships 最豪华的船 7、luxury 奢侈、奢华的 8、luxurious 心满意足的、舒适的 9、utmost 极度的、最大的 10、kind 种类 11、voya…

Kali Linux神秘工具教程(详细版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Kali Linux - 安装和配置信息收集工具二、NMAP隐形扫描搜索Searchsploit域名系统工具dnsenum.plDNSMAPdnstracerLBDHping3漏洞分析工具Cisco-torch工具Cisco…

回溯算法(基础)

目录 一、基本概念 二、以简单全排列认识回溯 (一)决策树 (二)回溯示意图 (三)核心代码 (四)完整代码 三、组合问题 (一)问题 &#xff08…

如何通过groovy扩展方法

最近一直使用jmeter做接口测试,虽然好用,但是每次解析结果都要写大量重复代码。然后想到groovy是可以在运行时动态增强jvm字节码的,比如Date中就有大量增强的方法,比如format,upto,downto......,既然groovy可以&#x…

用 NFTScan 的角度解析 Yuga labs NFT 项目系列

如果要说 NFT 影响力最大的公司是哪个?如果说是 Yuga Labs 应该我想大家应该都不会否认。一个创立一年多的 NFT 营销和开发公司,多次的并购以及行销操作都立下 NFT 界的标竿典范,尤其 BAYC NFT 系列取得巨大成功之后,该团队已成为…

DSP_定义一个大的全局数组_探索之路

前言 最近在做基于dsp平台的无通信接口系统辨识,辨识的时候会有很大的数据需要存到一个数组当中,而dsp如果定义一个很大的全局数组,编译会报错。 本文将探索如何解决这个报错以及全局数组的大小极限。 正文 首先,我们定义了一个…

数学库:Extreme Optimization Numerical 8.1.4 Crack

Extreme Optimization Numerical.NET 的极端优化数值库,更快地构建金融、工程和科学应用程序,具有置信度和预测带的非线性曲线拟合,用于 .NET的极端优化数值库是为 Microsoft .NET 框架构建的通用数学和统计类的集合。用于 .NET的极端优化数值…

将无风险资产与单个风险资产进行组合

目录 1. 基本概念 2. 将无风险资产与单个风险资产进行组合 3. 有效资产组合 1. 基本概念 无风险资产和风险资产。 我的理解:无风险资产利率完全可确定,风险资产的利率称为预期收益率,并且有标准差。 关于风险资产预期收益率和标准差的计…

NC65 自由报表发布为节点如何显示以及如何取消已发布的报表节点

NC65 自由报表发布为节点如何显示以及如何取消已发布的报表节点? 一、NC65 自由报表发布为节点如何显示? 答:需要在动态建模平台-权限管理-职责管理下的职责节点进行功能分配,如下图: 二、如何取消已发布的报表节…

Javac Spire.Presentation 之PPT文本图片内容提取

目录结构前言文档准备引入Maven依赖代码块提取结果验证ppt_demo.ppt 提取结果pptx_demo.pptx 提取结果前言 应公司需求,需实现以下功能 PPT文本内容的替换;PPT文本内容的提取;PPT中图片的提取存放; 此文章将使用Spire.Presenta…

Mal-PEG-SCM,Maleimide PEG SCM,双功能修饰性PEG

Mal-PEG-SCM,SCM-PEG-Maleimide,Maleimide PEG SCM,Maleimide PEG Succinimidyl Carboxymethyl Ester马来酰亚胺-聚乙二醇-琥珀酰亚胺羧甲基酯,马来酰亚胺PEG琥珀酰亚胺羧甲基酯Product specifications:1.CAS No&#…

DataGrip下载安装及使用教程(详细版)

一.安装教程 1.下载 官网下载:DataGrip: The Cross-Platform IDE for Databases && SQL by JetBrains 2.点击Download跳转到下载页面 3.下载最新版本的可以直接点击 Download 下载,下载其他版本的点击 Other versions 下载其他版本 4. 4.选择…

改变Linux文件权限、所属用户组、所有者知识总结

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Linux操作…

requestAnimationFrame详解-js性能优化

requestAnimationFrame 请求动画帧 它是一个浏览器的宏任务 requestAnimationFrame的用法与settimeout很相似,只是不需要设置时间间隔而已。requestAnimationFrame使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。它返回一个整数&#x…

快鲸SCRM打通工单系统,实现客户售前售后一体化管理

深度运营客户关系,做好客户售后服务,才符合企业的长远利益。然而大多数企业只注重售前售中,忽视了售后,导致客户售后服务现状不尽人意,主要体现在: 把客户问题抛到售后群后,便放任不管; 缺乏标…

自动驾驶感知——超声波技术

文章目录1. 超声波基本概念1.1 声波的频率与分类1.2 超声波的波速和波长1.3 超声波的指向性1.4 超声波的反射和折射1.5 超声波的衰减1.6 超声波产生的效应2. 超声波传感器原理及传感器分类2.1 超声波传感器原理2.2 压电式超声波传感器2.3 磁致伸缩式超声波传感器2.4 超声波传感…

MyBatis案例 | 使用映射配置文件实现CRUD操作——通过主键查询对应数据

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址:🔥JavaWeb Java入门篇: 🔥Java基础学习篇 Java进阶学习篇&…

关于Linux中断的相关查询

1.linux 内核 /proc/interrupts 在 /proc/interrupts 文件中记录了 Linux 内核的中断信息,我们可以通过命令查看 sudo cat /proc/interrupts 文件中以表格的形式列举出来所有的内核中断,其表头信息标注如下: 我们可以通过特定任务执行时…

计算机SCI论文一定要在指定的机构润色吗? - 易智编译EaseEditing

不一定要在指定的机构润色。 首先期刊要求润色,是非常正常的事情。国人投的中文论文,有的也会被要求润色。 更不要说国外的英文期刊了,咱们写的英文文章投过去,大部分都会被要求润色的。 为什么期刊总是要求润色语言呢&#xff…