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"
输出到mydb
的my_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
失败,停止并宣告聚合操作失败,之前已经在输出集合中写入或修改的文档不能回滚。
相关文章:
MongoDB聚合:$merge 阶段(1)
$merge的用途是把聚合管道产生的结果写入指定的集合,有时候可以用$merge来做物化视图。需要注意,$meger操作必须是聚合管道的最后一个阶段。具体功能有: 能够输出到当前或不同的数据库能够输出到正在聚合的集合(慎重:…...
2. 云原生实战之kubesphere搭建
文章目录 机器介绍centos基本配置安装 VMware Tools设置静态ip关闭防火墙关闭SELinux开启时间同步配置host和hostname 安装kubesphere依赖项安装配置文件准备执行安装命令 机器介绍 在ESXI中准备虚拟机,部署参考官网:https://kubesphere.io/zh/ CentOs…...

main参数传递、反汇编、汇编混合编程
week03 一、main参数传递二、反汇编三、汇编混合编程 一、main参数传递 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行传入整数参数的和” 注意C中main: int main(int argc, char *argv[]), 字符串“12” 转为12,可以调用atoi…...

前后端分离nodejs+vue医院预约挂号系统6nrhh
医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架:Express/koa 前端:Vue.js 数据库:mysql 开发软件:VScode/webstorm/hbuiderx均…...
在pytorch中,读取GPU上张量的数值 (数据从GPU到CPU) 的几种常用方法
1、.cpu() 方法: 使用 .cpu() 方法可以将张量从 GPU 移动到 CPU。这是一种简便的方法,常用于在进行 CPU 上的操作之前将数据从 GPU 取回 import torch# 在 GPU 上创建一个张量 gpu_tensor torch.tensor([1, 2, 3], devicecuda)# 将 GPU 上的张…...

【mysql】—— 表的内连和外连
在MySQL中,内连(INNER JOIN)和外连(OUTER JOIN)是用于联接多个表的操作。接下来,我分别给大家介绍下二者。 目录 (一)内连接 1、什么叫内连接 2、语法格式 3、案例:显…...

VSCode远程开发配置
目录 概要远程开发插件安装开始连接SSH无密码登录开发环境配置 概要 现在很多公司都是直接远程到服务器上写代码,使用远程开发,可以在与生产环境相同的环境中开发、测试和部署代码,减少因环境不同而导致的问题。当下VSCode远程开发是支持的比…...

复数值神经网络可能是深度学习的未来
一、说明 复数这种东西,在人的头脑中似乎抽象、似乎复杂,然而,对于计算机来说,一点也不抽象,不复杂,那么,将复数概念推广到神经网络会是什么结果呢?本篇介绍国外的一些同行的尝试实践,请我们注意观察他们的进展。...

【C语言】数据结构——排序二(快排)
💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:数组打印与交换1. 交换排序1.1 基本思想:1.2 冒泡与快排的异同 2. 冒泡排序2.1 基本思想2.2 …...

企业私有云容器化架构
什么是虚拟化: 虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM&#x…...

SpringBoot+modbus4j实现ModebusTCP通讯读取数据
场景 Windows上ModbusTCP模拟Master与Slave工具的使用: Windows上ModbusTCP模拟Master与Slave工具的使用-CSDN博客 Modebus TCP Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。 1996年施耐德公司推出基于以太网TCP/IP的Modbus协议&…...

Linux性能优化全景指南
Part1 Linux性能优化 1、性能优化性能指标 高并发和响应快对应着性能优化的两个核心指标:吞吐和延时 应用负载角度:直接影响了产品终端的用户体验系统资源角度:资源使用率、饱和度等 性能问题的本质就是系统资源已经到达瓶颈,但…...

树莓派 ubuntu20.04下 python调讯飞的语音API,语音识别和语音合成
目录 1.环境搭建2.去讯飞官网申请密钥3.语音识别(sst)4.语音合成(tts)5.USB声卡可能报错 1.环境搭建 #环境说明:(尽量在ubuntu下使用, 本次代码均在该环境下实现) sudo apt-get install sox # 安装语音播放软件 pip …...

分布式系统架构设计之分布式系统实践案例和未来展望
分布式系统在过去的几十年里经历了长足的发展,从最初的简单分布式架构到今天的微服务、云原生等先进架构,取得了丰硕的成果。本文将通过实际案例分享分布式系统的架构实践,并展望未来可能的发展方向。 一、实践案例 1、微服务化实践 背景 …...

【办公软件】Excel双坐标轴图表
在工作中整理测试数据,往往需要一个图表展示两个差异较大的指标。比如共有三个数据,其中两个是要进行对比的温度值,另一个指标是两个温度的差值,这个差值可能很小。 举个实际的例子:数据如下所示,NTC检测温…...

彻底理解前端安全面试题(1)—— XSS 攻击,3种XSS攻击详解,建议收藏(含源码)
前言 前端关于网络安全看似高深莫测,其实来来回回就那么点东西,我总结一下就是 3 1 4,3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略,其他的都是网络攻击。除了这…...
UE5.1_AI随机漫游
UE5.1_AI随机漫游 目录 UE5.1_AI随机漫游 AI随机漫游方法 方法1:AI角色蓝图直接写方法...

智慧城市新型基础设施建设综合方案:文件全文52页,附下载
关键词:智慧城市建设方案,智慧城市发展的前景和趋势,智慧城市项目方案,智慧城市管理平台,数字化城市,城市数字化转型 一、智慧城市新基建建设背景 1、城市化进程加速:随着城市化进程的加速&am…...

GitHub Copilot 终极详细介绍
编写代码通常是一项乏味且耗时的任务。现代开发人员一直在寻找新的方法来提高编程的生产力、准确性和效率。 像 GitHub Copilot 这样的自动代码生成工具可以使这成为可能。 GitHub Copilot 到底是什么? GitHub Copilot 于 2021 年 10 月推出,是 GitHub 的…...
LeetCode第63题 - 不同路径 II
题目 解答 class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m obstacleGrid.length;int n obstacleGrid[0].length;if (obstacleGrid[0][0] 1) {return 0;}if (obstacleGrid[m - 1][n - 1] 1) {return 0;}int[][] dp new int[m][n];dp…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...