Mongodb数组元素更新之使用$定位数组第一个元素

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第63篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。

阅读了不少Mongodb的文章,也和同事交流过。Mongodb数组更新是比较难理解的地方,而且使用到的频率也相对较低。但Mongodb官网对这部分知识介绍的很详细,深入阅读和实践后对工作和学习也有很大的启发。所以整理出来,共大家研究参考。也希望可以和您一起探讨Mongodb的知识。

定义

位置操作符$, 指定了数组中需要更新的元素。使用$符号,避免了显示指定数组中需要更新元素的位置。

语法

位置操作符$,要按照下面的形式使用

{"<array>.$": value}

其中,位置操作符$符号,表示符合查询结果的第一个元素。而需要更新的数组字段名称,必须存在于查询过滤条件当中。

db.collection.updateOne({<array>: value, ...},{<update operator>: {"<array>.$": value}}
)

行为

  • 自mongodb5.0开始,UPDATE操作按照字段名称的字典顺序更新字段。当字段中包含数字时,按照数字顺序依次更新字段。当然,对一个文档的多个字段操作,是原子性的。
  • 使用upsert时,不可以使用位置操作符$。插入数据时,$符号会被看做字段名称。
  • 位置$操作符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$占位符的替换是单个值
  • 在$unset操作中,位置操作符更新数据时,不会删除数组元素,而是将该数组元素设置为null。
  • 位置操作符不能用在反向操作中,如$ne, $not, $nin. 但在$elemMatch操作中使用反向过滤条件时,用户可以使用位置操作符更新字段。
  • 在对多个数组字段进行过滤时,位置$ update操作符的行为是有歧义的。当服务器执行update方法时,它首先运行一个查询来确定要更新哪些文档。如果update过滤了多个数组字段,那么后续对位置$ update操作符的调用并不总是更新数组中所需的位置。

应用

更新数组中的元素

创建集合students并插入数据。其中字段grades是包含三个元素的数组。

db.students.insertMany([{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
])

将grades数组中第一个为80的元素值更新到82. 若用户不清楚80在数组中的位置是,可以使用位置操作符$。 但要注意,查询条件中必须包含要更新的数组。

db.students.updateOne({ _id: 1, grades:  80}, //查询_id是1,数组中包含80的文档{ $set: {"grades.$": 82}} //将查询到的文档中,第一个为80的数组元素更新为80)

在查询语序中,位置操作符$符号,找到了第一个符合查询条件的数组元素。

更新数组中的文档

在UPDATE中使用位置操作符$,也可以更新包含文档类型的数组。使用$操作符更新文档数组时,需要使用点操作符。

db.collection.updateOne({<query selector>},{<update operator>: {"array.$.field": value}}
)

在students集合中添加下面的数据文档

db.students.insertOne({_id: 4,grades: [{ grade: 80, mean: 75, std:8},{ grade: 85, mean: 90, std:5},{ grade: 85, mean: 85, std: 8 }]
})

构造数据更新语句,更新符合grade等于85的第一个数组元素,将std值更新为6

db.students.updateOne({_id: 4, "grades.grade": 85}, //此处必须包含grades数组作为过滤条件{ $set: {"grades.$.std": 6}})

使用符合查询条件更新内嵌数组文档

使用位置操作符$,可以更新符合复合查询条件数组中的第一个元素。

向students集合中,插入数据。

db.students.insertOne({_id: 5,grades: [{ grade: 80, mean: 75, std:8},{ grade: 85, mean: 90, std:5},{ grade: 90, mean: 85, std: 3 }]
})

在下面的更新语句中,使用$elemMatch构建了一个符合查询条件,过滤数组grades中的文档。

db.students.updateOne({_id: 5,grades: { $elemMatch: {grade: {$lte:90}, mean: {$gt:80}}}
}, {$set: {"grades.$.std": 6}})

过滤grades小于等于80, mean大于80的数据,即数组中第二个和第三个元素。使用$更新第一个找到的元素。只是将std:5更新到了6.

多数组匹配更新

在对多个数组字段进行过滤时,位置$ update操作符的行为是有歧义的。

构建集合students_deans_list. 其中包括三个数组字段, activity_ids, grades, deans_list.

db.students_deans_list.insertMany([{_id: 8,activity_ids: [ 1, 2 ],grades: [ 90, 95 ],deans_list: [ 2021, 2020 ]}])

构建下面的数据更新语句。用户尝试更新字段deans_list. 使用activity_ids, deans_list和grades字段进行过滤。将数值2021更新成2022.

db.students_deans_list.updateOne({ activity_ids: 1, grades:  95, deans_list:2021},{ $set: {"deans_list.$": 2022}})

当执行更新语句时,尽管使用过滤条件,查询出了_id为8的数据 ,但位置操作符$更新了数值2020的数据。

{"_id" : 8,"activity_ids" : [ 1, 2 ],"grades" : [ 90, 95 ],"deans_list" : [ 2021, 2022 ]
}

为了避免这个问题,Mongodb给出了位置操作符的另外一种使用方法。$[<identifier>].我们下一篇文章就详细描述这个方法。

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

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

相关文章

EXCEL多sheet添加目录跳转

EXCEL多sheet添加目录跳转 背景 excel中有几十个sheet&#xff0c;点下方左右切换sheet太耗时&#xff0c;希望可以有根据sheet名超链接跳转相应sheet&#xff0c;处理完后再跳回原sheet。 方案一 新建目录sheet&#xff0c;在A1写sheet名&#xff0c;右键选择最下方超链接…

问题:材料题请点击右侧查看材料问题 查看材料 #学习方法#经验分享#学习方法

问题&#xff1a;材料题请点击右侧查看材料问题 查看材料 A.Colleges may reduce their enrollment. B.Top universities become increasingly competitive. C.Universities become selective in student admission. D.Colleges invest less in academy and infrastructure…

Go 文件压缩解压

在Go语言中&#xff0c;archive/zip包提供了创建、读取和解压缩ZIP格式文件的功能。 一、创建ZIP文件并添加内容----压缩 package mainimport ("archive/zip""bytes""fmt""io""log""os" )func main() {// 创建一…

el-input中change事件造成的坑

el-input中change事件造成的坑 一、change事件定义二、如果仅回车时候触发 一、change事件定义 仅在输入框失去焦点或用户按下回车时触发 二、如果仅回车时候触发 <el-inputv-model.trim"questionInput"placeholder"请输入你的问题&#xff0c;按回车发送&…

智慧视觉怎么识别视频?智慧机器视觉是通过什么步骤识别视频的?

智慧视觉功能怎么识别视频&#xff1f;智慧视觉是搭载在智能设备比如手机、AI盒子、机器视觉系统上的一个应用程序或特性&#xff0c;采用计算机视觉和人工智能的技术来识别图像或视频中的内容。如果想了解视频识别&#xff0c;就要明白智慧视觉功能会涉及的以下几个关键步骤和…

pxe自动装机

概念 pxe是c/s模式。允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像&#xff0c;加载安装文件&#xff0c;实现自动化安装操作系统。 无人值守&#xff1a;安装选项不需要人为干预&#xff0c;可以自动化实现。 pxe的优点&#xff1a;1.规模化&…

机器人阻抗控制中的机械阻抗模型

机器人阻抗控制中的机械阻抗模型主要涉及到通过修改机器人与环境接触作业的动力学模型&#xff0c;使其等效为一个期望的阻抗&#xff08;弹簧-质量-阻尼&#xff09;模型。以下是对机械阻抗模型在机器人阻抗控制中的详细解释&#xff1a; 阻抗控制原理&#xff1a; 机器人阻抗…

Python——泰坦尼克号数据分析

目录 🧾1.数据集(部分数据) ✏️ 2、导入数据集与必要模块 ⌨️ 3.数据预处理 1️⃣ isnull函数查看有无缺失值 2️⃣fillna函数填充缺失值 📍 Age字段使用平均值填充缺失值 📍 Embarked字段填充缺失值 3️⃣ 删除缺失值较多的字段 📊 4.数据可视化 1️⃣ di…

流媒体服务器SMS-语音对讲(二)

1.简介 上篇文件介绍了流媒体与设备之间可能的交互场景&#xff0c;本文将介绍客户端或者web端与摄像头对讲的总体流程。 老规矩&#xff0c;介绍一下本人的开源流媒体&#xff0c;点个star&#xff0c;有兴趣一起开发的朋友也可以联系本人&#xff1a;https://gitee.com/inyem…

PostgreSQL的发布和订阅功能

发布和订阅功能在 PostgreSQL 9.0 版本中首次引入,并进一步改进和增强了后续版本中。所以,从 PostgreSQL 9.0 版本开始,就可以使用发布和订阅功能来实现数据复制和同步 发布和订阅功能在 PostgreSQL 中提供了一种灵活、可靠的数据复制和同步机制,具有许多优点和一些缺点:…

[数据集][目标检测]医疗防护服检测数据集VOC+YOLO格式649张7类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;649 标注数量(xml文件个数)&#xff1a;649 标注数量(txt文件个数)&#xff1a;649 标注类别…

echarts学习: 在图表中添加多条y轴会怎么样?

前言 在撰写如何绘制双y轴图表文章时&#xff0c;我突然萌生出了一个想法&#xff0c;如果给图表添加两个以上的y轴会怎么样呢? 带着这个问题我开始了自己的探索之旅。 我找到了一篇优秀的文章作为参考&#xff0c;虽然它需要付费&#xff0c;但是不要紧&#xff0c;文中免费…

Vulnhub-DC-4

靶机IP:192.168.20.138 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 信息收集 nmap扫下端口及版本 dirsearch扫下目录 没发现什么敏感信息&#xff0c;看下前端界面 想到会不会存在SQL注入&#xff0c;弱密码等漏洞。 经过测试SQL注入…

k8s网络问题以及容器跨宿主机通信原理

【0】资源配置文件 [rootmcwk8s03 mcwtest]# ls mcwdeploy.yaml [rootmcwk8s03 mcwtest]# cat mcwdeploy.yaml apiVersion: apps/v1 kind: Deployment metadata:labels:app: mcwpythonname: mcwtest-deploy spec:replicas: 1selector:matchLabels:app: mcwpythontemplate:met…

Linux进程间通信之管道

进程间通信介绍&#xff1a; 进程间通信的概念&#xff1a; 进程间通信简称IPC&#xff08;Interprocess communication&#xff09;&#xff0c;进程间通信就是在不同进程之间传播或交换信息。 进程间通信的目的&#xff1a; 数据传输&#xff1a; 一个进程需要将它的数据…

开源WebGIS全流程常用技术栈

1 数据生产 1.1 uDig uDig&#xff08;http://udig.refractions.net/&#xff09;是一个基于Java开源的桌面应用框架&#xff0c;它构建在Eclipse RCP和GeoTools&#xff08;一个开源的Java GIS包)上。可以进行shp格式地图文件的编辑和查看&#xff1b;是一个开源空间数据查看…

​在哪些场景下,使用SOCKS5代理会特别有用?(socks5代理ip)​

SOCKS5代理作为网络协议转换的利器&#xff0c;其独特功能在众多实际场景中展现出了极大的价值。以下是几个特定场景&#xff0c;其中SOCKS5代理的使用将变得尤为重要&#xff1a; 一、网络安全与隐私访问 1.高级渗透测试&#xff1a;在网络安全领域&#xff0c;渗透测试人员…

Java 异常处理 - 自定义异常

在Java中&#xff0c;自定义异常是一种创建新异常类的方式&#xff0c;这些异常类继承自Throwable类或其子类Exception&#xff08;或RuntimeException&#xff0c;如果它是运行时异常的话&#xff09;。自定义异常通常用于描述特定于应用程序的错误情况&#xff0c;以便为调用…

MS21112S单通道 LVDS 差分线路接收器

MS21112S 是一款单通道低压差分信号 (LVDS) 线 路接收器。在输入共模电压范围内&#xff0c;差分接收器可以 将 100mV 的差分输入电压转换成有效的逻辑输出。 该芯片可应用于 100Ω 的受控阻抗介质上&#xff0c;进行点对 点基带数据传输。传输介质可以是印刷电路板、…