MongoDB聚合:$merge 阶段(1)

$merge的用途是把聚合管道产生的结果写入指定的集合,有时候可以用$merge来做物化视图。需要注意,$meger操作必须是聚合管道的最后一个阶段。具体功能有:

  • 能够输出到当前或不同的数据库
  • 能够输出到正在聚合的集合(慎重:可能会导致频繁的更新甚至死循环)
  • 可以在副本集的二级节点运行,前提是群集所有节点的featureCompatibilityVersion不小于4.4,且读选项允许二级读取。注意:
    • $merge读取操作会发送到二级节点,写入操作只发生在主节点。
    • 并非所有版本的驱动都支持$merge在副本集二级节点的操作,在使用前要确认驱动支持。
  • 输出集合不存在时可以自动创建输出集合,数据库不存在时也可以自动创建
  • 输出结果可以与现有集合合并,包括:插入新文档、合并文档、替换文档、保持已存在的文档、让操作失败、使用自定义的更新管道处理文档等。

语法

{ $merge: {into: <collection> -or- { db: <db>, coll: <collection> },on: <identifier field> -or- [ <identifier field1>, ...], // 可选let: <variables>, // 可选whenMatched: <replace|keepExisting|merge|fail|pipeline>,  // 可选whenNotMatched: <insert|discard|fail>  //可选
} }

举例:

{ $merge: {into: "mycollection", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } }

如果都使用$merge的默认选项并且输出到当前数据库,可以使用简化形式:

{ $merge: <collection> } //输出到当前数据库

字段说明

into

输出到的集合,可以指定到数据库,也可以不指定数据库,输出到当前数据库。例如:

输出到当前库的my_coll集合:into: "my_coll"

输出到mydbmy_coll集合:into:{db:"mydb", coll:"my_coll"}

注意:

  • 如果目标库或集合不存在,会自动创建
  • 如果是共享的群集,目标集合必须要存在
  • 输出集合也可以是共享集合
on

可选字段,可以指定一个或多个字段作为判断文档唯一性的ID,用于匹配目标集合中是否已经存在相同ID的文档。

举例:

  • 一个字段:on: "_id"
  • 多个字段:on: ["date", "name"]

注意:

  • 如果指定了on字段,除非on_id,否则在聚合结果文档中必须存在on中指定的字段,如果聚合结果中没有_id字段,会自动添加一个。
  • on指定的字段的值不允许为空或数组。
  • $merge必须要有一个包含on字段的唯一索引,索引键顺序无关紧要。
    • 索引必须有跟聚合集合同样的集合
    • 唯一索引必须是一个稀疏索引
    • 唯一索引不能是部分索引
    • 对已经存在的输出集合,相应的索引必须已经存在
  • on的缺省值依赖于输出集合:
    • 如果输出集合不存在,on的标识符必须且缺省为_id字段,相应的唯一索引_id是被自动创建的。
    • 如果输出集合是已经存在的分片集合,on标识符缺省为_id字段
    • 如果输出集合是已经存在的非分片集合,on标识符缺省为所有分片键值字段和_id字段,如果指定了一个不同的on标识符,on必须包含所有的分片键值字段。
whenMatched

可选字段,指定当输出集合中存在与on字段指定的键值相同的文档时的处理方式,可以为以下值:

“replace” 替换

使用聚合结果替换已经存在的文档。当执行替换的时候不能修改对应文档_id字段的值,如果输出集合是分片集合,也不能修改分片键值,否则操作会产生错误。为了避免这个错误,如果on字段中没有包含_id字段,可以从聚合结果中移除_id字段以避免这个错误,比如可以使用类似$unset的阶段预先处理以下。

“keepExistin” 保留已存在的

不替换已经存在的文档

“merge" 合并

缺省值,合并匹配的文档,类似于$mergeObjects操作

  • 如果聚合结果文档的字段在目标文档中不存在,就添加
  • 如果聚合结果文档的字段在目标文档中已存在,则替换

举例:

如果目标集合有一个文档:

{_id: 1, a: 1, b: 1 }

聚合结果的文档是:

{ _id: 1, b: 5, z: 1 }

则合并后的文档是:

{ _id: 1, a: 1, b: 5, z: 1 }

"replace"类似,合并的时候"_id"字段或分片键值是不能被修改的。

“fail” 失败

停止并且报错,之前所有的输出和更改都不能撤销。

使用聚合管道更新输出集合文档

on指定的键值相同时,使用一个聚合管道更新输出集合的文档,如:

[ <stage1>, <stage2> ... ]

但是,管道只能包含下面的阶段:

  • $addFields及其别名$set
  • $projecct及其别名$unset
  • $replaceRoot及其别名$replaceWith

管道不能修改on涉及字段的值,比如匹配字段year,管道是不能修改year字段值的。另外whenMatched管道可以使用$<field>直接访问输出文档的字段。如果要在管道中访问聚合结果文档(就是输入文档)的字段,可以使用下面两种方式:

  • 使用内置的$$new变量来访问字段,就是$$new.<field>$$new变量只能在省略let时才能使用。
  • let字段使用用户自定义的变量。以$$符号为前缀指定变量名$$<variable_name>,如:$$year。如果变量是文档,也可以包含文档字段,格式为$$<变量名>.<字段>。例如,$$year.month
let

可选字段,为whenMatched的管道指定变量。可以指定文档的变量名和表达式:

{ <variable_name_1>: <expression_1>,...,<variable_name_n>: <expression_n> }
whenNotMatch

可选字段,决定了$merge在输出文档匹没有配到对应文档的情况,可以指定下面的预定义的字符串常量:

  • "insert"插入,缺省值,将聚合后的文档插入到输出集合。
  • discard丢弃,就是不向输出集合中插入文档。
  • fail失败,停止并宣告聚合操作失败,之前已经在输出集合中写入或修改的文档不能回滚。

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

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

相关文章

Observer观察者模式(组件协作)

观察者模式&#xff08;组件协作&#xff09; 链接&#xff1a;观察者模式实例代码 解析 目的 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系” ——一个对象&#xff08;目标对象&#xff09;的状态发生改变&#xff0c;所有的依赖对象&#xff0…

UI演示双视图立体匹配与重建

相关文章&#xff1a; PyQt5和Qt designer的详细安装教程&#xff1a;https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501Qt designer界面和所有组件功能的详细介绍&#xff1a;https://blog.csdn.net/qq_43811536/article/details/1351868…

门诊抽血化验污水处理设备生产厂家

诸城市鑫淼环保小编带大家了解一下门诊抽血化验污水处理设备生产厂家 疾控中心实验室废水处理一体化设备的构造原理是在采用生化处理技术的基础上&#xff0c;结合化学、物理处理工艺&#xff0c;对实验室废水进行处理&#xff0c;达到达标排放的要求。一体化设备包括厌氧处理系…

MySQL 执行过程

MySQL 的执行流程也确实是一个复杂的过程&#xff0c;它涉及多个组件的协同工作&#xff0c;故而在面试或者工作的过程中很容易陷入迷惑和误区。 MySQL 执行过程 本篇将以 MySQL 常见的 InnoDB 存储引擎为例&#xff0c;为大家详细介绍 SQL 语句的执行流程。从连接器开始&…

Spring基础IoC(控制反转)与DI(依赖注入)

1. Spring 基础 1.1 什么是Spring框架&#xff1f;它能带来那些好处&#xff1f; Spring 是一个开源的轻量级的 Java 开发框架&#xff0c;可以帮助开发人员更高效的进行开发&#xff0c;主要优势在于简化开发和框架整合。 Spring框架整合了很多模块&#xff0c;这些模块可以…

LeetCode 刷题日志

文章目录 1954. 收集足够苹果的最小花园周长思考&#xff1a;暴力枚举代码实现二分查找代码实现 1954. 收集足够苹果的最小花园周长 1954. 收集足够苹果的最小花园周长 难度&#xff1a; 中等 题目大意&#xff1a; 给你一个用无限二维网格表示的花园&#xff0c;每一个 整…

Matplotlib ------ 纵坐标科学计数法含义

matplotlib 纵坐标科学计数法含义 引言正文 引言 今天画图时遇到了一个问题&#xff0c;发现纵坐标是科学计数法的表示&#xff0c;但是很难理解它的含义&#xff0c;这里特来记录一下。 正文 我们以下图为例&#xff0c; 由图上我们可以看出&#xff0c;纵坐标显示为 1e-…

PHP序列化总结3--反序列化的简单利用及案例分析

反序列化中生成对象里面的值&#xff0c;是由反序列化里面的值决定&#xff0c;与原类中预定义的值的值无关&#xff0c;穷反序列化的对象可以使用类中的变量和方法 案例分析 反序列化中的值可以覆盖原类中的值 我们创建一个对象&#xff0c;对象创建的时候触发了construct方…

纯CSS3制作优惠券线性UI效果

纯CSS3制作优惠券线性UI效果-遇见你与你分享

《分布式事务理论基础:CAP定理 BASE理论》

目录 学习目标 1.分布式事务理论基础 1.1.本地事务 1.2.分布式事务 分布式事务产生的原因&#xff1f; 哪些场景会产生分布式事务&#xff1f; 单体系统会产生分布式事务问题吗&#xff1f; 只有一个库&#xff0c;会产生分布式事务问题吗&#xff1f; 分布式事务举…

rax3000m刷openwrt固件

rax3000m刷机过程&#xff08;nand版本&#xff09; 刷机准备文件https://www.123pan.com/s/X5m9-6Ynj.html提取码:VtBW 接线关系&#xff1a;路由器lan口接电脑 1.上传配置开启ssh的配置文件&#xff08;登录路由器后台管理界面在找到配置管理&#xff0c;上传配置文件rax3…

LeetCode第1题 - 两数之和

题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例 给定 nums [2, 7, 11, 15], …

HBase深度历险 | 京东物流技术团队

简介 HBase 的全称是 Hadoop Database&#xff0c;是一个分布式的&#xff0c;可扩展&#xff0c;面向列簇的数据库&#xff0c;是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。本文会像剥洋葱一样&#xff0c;层层剥开她的心。 特点 首先我…

【网络安全 | CTF】FlatScience

该题考察SQL注入 正文 后台扫到robots.txt 页面内容如下&#xff1a; 进入login.php 页面源代码如图&#xff1a; 传参debug得到php代码&#xff1a; <?php if(isset($_POST[usr]) && isset($_POST[pw])){$user $_POST[usr];$pass $_POST[pw];$db new SQLite3…

ArcGIS批量计算shp面积并导出shp数据总面积(建模法)

在处理shp数据时&#xff0c; 又是我们需要知道许多个shp字段的批量计算&#xff0c;例如计算shp的总面积、面积平均值等&#xff0c;但是单个查看shp文件的属性进行汇总过于繁琐&#xff0c;因此可以借助建模批处理来计算。 首先准备数据&#xff1a;一个含有多个shp的文件夹。…

台式电脑 windows系统蓝屏解决思路+真实案例

台式电脑 windows系统蓝屏解决思路真实案例 start 最近番茄初次装机&#xff0c;遇到了多次蓝屏的情况&#xff0c;周转多次最终还是解决了问题。写这篇文章&#xff0c;记录一下遇到蓝屏情况&#xff0c;记录做了哪些操作&#xff0c;以及解决问题的思路。 1. 排查问题原因…

【三维目标检测/自动驾驶】IA-BEV:基于结构先验和自增强学习的实例感知三维目标检测(AAAI 2024)

系列文章目录 论文&#xff1a;Instance-aware Multi-Camera 3D Object Detection with Structural Priors Mining and Self-Boosting Learning 地址&#xff1a;https://arxiv.org/pdf/2312.08004.pdf 来源&#xff1a;复旦大学 英特尔Shanghai Key Lab /美团 文章目录 系列文…

AJAX:整理1: 了解AJAX的相关知识

1. 优点&#xff1a; &#xff08;1&#xff09;可以无需刷新页面与服务器端进行通信&#xff1b; &#xff08;2&#xff09;允许你根据用户事件来更新部分页面内容 2. 缺点&#xff1a; &#xff08;1&#xff09;没有浏览历史&#xff0c;不能回退&#xff1b; &#xf…

初识智慧城市

文章目录 智慧家居 智慧社区 智慧交通 智慧医疗 智慧教育 智慧旅游 智慧农业 智慧安防 智慧家居 利用智能语音、智能交互等技术,实现用户对家居系统各设备的远程操控和能控制如开关窗帘(窗户)、操控家用电器和照明系统、打扫卫生等操作。利用计算机视觉等技术,对被照看…

数据库——简单查询复杂查询

1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机&#xff0c;在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作&#xff1a; &#xff08;1&#xff09;登录 MySQL&#xff0c;在 MySQL 中创建用户&#xff0c;…