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…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
