当前位置: 首页 > news >正文

MongoDB 聚合操作Map-Reduce

这此之前已经对MongoDB中的一些聚合操作进行了详细的介绍,主要介绍了聚合方法和聚合管道;如果您想对聚合方法和聚合管道进行了解,可以参考:

MongoDB 数据库操作汇总https://blog.csdn.net/m1729339749/article/details/130086022中的聚合操作。

本篇我们介绍另外一种聚合操作(Map-Reduce),其中Map代表的是文档映射,Reduce代表的是对映射的结果进行计算。

一、准备工作

初始化课程成绩数据

db.subjectScores.insertMany([{ "_id": 1, "name": "张三", "subject": "eng", "score": 80 },{ "_id": 2, "name": "李四", "subject": "eng", "score": 60 },{ "_id": 3, "name": "王五", "subject": "eng", "score": 90 },{ "_id": 4, "name": "张三", "subject": "math", "score": 70 },{ "_id": 5, "name": "李四", "subject": "math", "score": 90 },{ "_id": 6, "name": "王五", "subject": "math", "score": 50 },{ "_id": 7, "name": "张三", "subject": "physics", "score": 80 },{ "_id": 8, "name": "李四", "subject": "physics", "score": 60 },{ "_id": 9, "name": "王五", "subject": "physics", "score": 70 }
])

二、Map-Reduce

语法:

db.collection.mapReduce(<map>,<reduce>,{out: <collection>,query: <document>,sort: <document>,limit: <number>,finalize: <function>,scope: <document>,jsMode: <boolean>,bypassDocumentValidation: <boolean>})

其中,

<map>:代表的是Map函数(JavaScript函数),它可以把每个输入的文档转换成0个或者多个文档。

map函数的格式如下: 

function() {...emit(key, value);
}

可以将map函数理解为分组,其中key代表的是分组的字段;value代表的是需要进行聚合运算的字段。 

<reduce>:代表的是Reduce函数(JavaScript函数)。

reduce函数的格式如下: 

function(key, values) {...return result;
}

可以将reduce函数理解为分组后的聚合运算,其中key代表的是分组的字段,values代表的是需要进行聚合运算的字段对应的所有的字段值。

out:代表的是输出结果到集合或者直接输出,如果直接输出使用inline。

输出结果到集合中:

out: { <action>: <collectionName>[, db: <dbName>] }

 <action>:

        replace:如果集合存在,则替换现有的集合

        merge:如果集合存在,当文档冲突时,则覆盖

        reduce:如果集合存在,当文档冲突时,将reduce函数应用于新文档和现有文档(集合中冲突的文档),并将结果覆盖现有文档;

<collectionName>:集合

<dbName>:数据库

直接输出结果:

out: { inline: 1 }

query:代表的是查询选择器,会将满足条件的文档输入到map函数中

如果您想了解查询选择器,可以参考:

MongoDB 查询文档中使用比较选择器、逻辑选择器icon-default.png?t=N3I4https://blog.csdn.net/m1729339749/article/details/129965699

MongoDB 查询文档中使用元素选择器、数组选择器icon-default.png?t=N3I4https://blog.csdn.net/m1729339749/article/details/129971708

sort:代表的是对输入的文档进行排序,此选项适用于优化

limit:代表的是指定输入到map函数的文档的最大数量

finalize:可选,代表的是对reduce函数输出的文档进行更改,是一个Javascript函数

scope:代表的是定义map、reduce、finalize函数中可以全局使用的变量

jsMode:代表的是在执行map、reduce函数之间,是否将中间数据转换为BSON格式,默认值为false。

       (1)如果为false:在内部,MongoDB通过map函数将Javascript对象转换成BSON对象,当调用reduce函数时,BSON对象会被转换成Javascript对象;map-reduce会放置中间BSON对象在临时的磁盘存储中,这将允许对任意大型数据集执行操作。

       (2) 如果为true:在内部,map函数执行完之后会保留Javascript对象,在执行reduce函数时不再需要转换,能够更快的得到结果;只能用于映射函数的key少于500000个的情况。

bypassDocumentValidation:可选,是否绕开文档验证

5.0版本以后,Map-Reduce已经过时,建议是使用$accumulator 和 $function 聚合运算符

三、例子:计算学生的总分数

聚合查询如下:

db.subjectScores.mapReduce(function() {emit(this.name, this.score);},function(key, values) {return Array.sum(values);},{out: { inline: 1 }}
)

我们对上面的聚合查询进行解释:

1、map函数中使用name作为key进行分组,score作为value进行聚合运行

2、reduce函数中对values(也就是name相同的所有的score组成的数组)进行求和;这里使用的Array.sum是Javascript函数

3、对mapReduce的结果进行直接输出

聚合查询的结果如下:

{"results" : [{"_id" : "李四","value" : 210},{"_id" : "张三","value" : 230},{"_id" : "王五","value" : 210}],"ok" : 1
}

相关文章:

MongoDB 聚合操作Map-Reduce

这此之前已经对MongoDB中的一些聚合操作进行了详细的介绍&#xff0c;主要介绍了聚合方法和聚合管道&#xff1b;如果您想对聚合方法和聚合管道进行了解&#xff0c;可以参考&#xff1a; MongoDB 数据库操作汇总https://blog.csdn.net/m1729339749/article/details/130086022…...

shiro CVE-2016-4437 漏洞复现

shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序漏洞原理 在Apache shiro的框架中&#xff0c;执行身份验证时提供了…...

Seqkit-2.2.0 移植指南(openEuler 20.03 LTS SP3)

1.软件介绍 seqkit是一种跨平台的、极快的&#xff0c;全面的fasta/q处理工具。seqkit为所有的主流操作系统提供了一种可执行的双元文件&#xff0c;包括Windows&#xff0c;Linux&#xff0c;MacOS X&#xff0c;并且不依赖于任何的配置或预先配置就可以直接使用。 关于seqk…...

Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…...

二十三种设计模式第五篇--原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是用于创建重复的对象&#xff0c;同时又能保证性能。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口&#xff0c;该接口用于创建当前对象的克隆。当直接创建…...

阿里云镜像区别公共镜像、自定义、共享、云市场和社区镜像介绍

阿里云服务器镜像根据来源不同分为公共镜像、自定义镜像、共享镜像、云市场镜像和社区镜像&#xff0c;一般没有特殊情况选择公共镜像&#xff0c;公共镜像是阿里云官网提供的正版授权操作系统&#xff0c;云市场镜像是在纯净版操作系统的基础上预装了相关软件及运行环境&#…...

非线性方程二分法

非线性方程二分法 优点&#xff1a;算法直观、简单、总能保证收敛&#xff1b;局限&#xff1a;收敛速度慢、一般不单独用它求根&#xff0c;仅为了获取根的粗略近似 文章目录 非线性方程二分法[toc]1 二分法基本思想2 二分法实现 1 二分法基本思想 设 f ( x ) f(x) f(x)在 [ …...

H3C防火墙单机旁路部署(网关在防火墙)

防火墙旁路部署在核心交换机上&#xff0c;内网有三个网段vlan 10&#xff1a;172.16.10.1/24、vlan 20&#xff1a;172.16.20.1/24、vlan30&#xff1a;172.16.30.1。要求内网网关在防火墙设备上&#xff0c;由防火墙作为DHCP服务器给终端下发地址&#xff0c;同时由防火墙来控…...

基于密度的无线传感器网络聚类算法的博弈分析(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 提高能源效率是无线传感器网络面临的关键挑战之一&#xff0c;无线传感器网络日益普遍。由于节点&#xff08;传感器&#xff…...

宕机了?!DolphinScheduler 高可用和 Failover 机制关键时刻保命

高可用性是 Apache DolphinScheduler 的特性之一。它通过冗余来避免单点问题&#xff0c;所有组件天然支持横向扩容&#xff1b;但仅仅保证了冗余还不够&#xff0c;当系统中有节点宕机时&#xff0c;还需要有故障转移机制能够自动将宕机节点正在处理的工作转移到新节点上执行&…...

try(){}用法try-with-resources、try-catch-finally

属于Java7的新特性。 经常会用try-catch来捕获有可能抛出异常的代码。如果其中还涉及到资源的使用的话&#xff0c;最后在finally块中显示的释放掉有可能被占用的资源。 但是如果资源类已经实现了AutoCloseable这个接口的话&#xff0c;可以在try()括号中可以写操作资源的语句(…...

常见Http错误码学习

​ 常见 http 错误码 服务器巡检时比较常见的 http 错误码 400 Bad Request408 Request Timeout499 client has closed connection502 Bad Gateway504 Gateway Timeout 这些错误码反映了服务器什么样的状态&#xff0c;仅看字面意思还不太容易理解&#xff0c;就动手做个试验…...

qemu-基础篇——ARM 链接过程分析(六)

文章目录 ARM 链接过程分析源文件global_bss_file.cglobal_data_fle.cglobal_function_file.cglobal_rodata_file.cmain.c 链接文件 link.lds编译命令及反汇编命令解析 .o 文件global_bss_file.oglobal_data_fle.oglobal_function_file.oglobal_rodata_file.omain.o 链接观察链…...

Java企业工程项目管理系统+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

Eureka与Zookeeper的区别

著名的CAP 理论指出&#xff0c;一个分布式系统不可能同时满足 C( 一致性 ) 、 A( 可用性 ) 和 P( 分区容错性 ) 。 由于分区容错性在是分布式系统中必须要保证的&#xff0c;因此我们只能在 A 和 C 之间进行权衡&#xff0c;在此 Zookeeper 保证的是 CP, 而 Eureka 则是 AP…...

顺序表和链表的各种代码实现

一、线性表 在日常生活中&#xff0c;线性表的例子比比皆是。例如&#xff0c;26个英文字母的字母表&#xff08;A,B,C,……&#xff0c;Z&#xff09;是一个线性表&#xff0c;表中的数据元素式单个字母。在稍复杂的线性表中&#xff0c;一个数据元素可以包含若干个数据项。例…...

C# 介绍三种不同组件创建PDF文档的方式

1 c# 数据保存为PDF&#xff08;一&#xff09; &#xff08;spire pdf篇&#xff09; 2 c# 数据保存为PDF&#xff08;二&#xff09; &#xff08;Aspose pdf篇&#xff09; 3 c# 数据保存为PDF&#xff08;三&#xff09; &#xff08;PdfSharp篇&#xff09; 组件名称 绘制…...

极简面试题 --- Redis

什么是 Redis&#xff1f; Redis 是一个基于内存的键值存储系统&#xff0c;也被称为数据结构服务器。它支持多种数据结构&#xff0c;例如字符串、哈希表、列表、集合和有序集合&#xff0c;并且可以在内存中快速读写。 Redis 的优势有哪些&#xff1f; 快速&#xff1a;由…...

可视化图表API格式要求有哪些?Sugar BI详细代码示例(4)

Sugar BI中的每个图表可以对应一个数据 API&#xff0c;用户浏览报表时&#xff0c;选定一定的过滤条件&#xff0c;点击「查询」按钮将会通过 API 拉取相应的数据&#xff1b;前面说过&#xff0c;为了确保用户数据的安全性&#xff0c;Sugar BI上的所有数据请求都在Sugar BI的…...

学习vue(可与知乎合并)

一&#xff1a;组件及交互 1、什么是组件&#xff1f; 组件是可复用的 Vue 实例&#xff0c;且带有一个名字&#xff1a;在这个例子中是 。我们可以在一个通过 new Vue 创建的 Vue 根实例中&#xff0c;把这个组件作为自定义元素来使用&#xff1a; 声明组件 // 定义一个名…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...