MongoDB使用$addToSet向数组中添加元素

devtools/2024/10/18 12:31:13/

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第66篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。

本文来源于mongodb的官方文档,探讨向mongodb的数组中添加元素的方法$addToSet。

定义

使用方法$addToSet, 向数组中添加不存在的元素。如果元素已经存在于目标数组当中,则使用$addToSet不会更新当前文档。

语法

按照下面的形式使用$addToSet操作符。

{$addToSet: {<field1>: <value1>, ...}}

当向嵌入文档或数组中添加元素时,使用点操作符。

行为

  • mongodb5.0开始,UPDATE操作按照字段名称的字典顺序更新字段。当字段中包含数字时,按照数字顺序依次更新字段。当然,对一个文档的多个字段操作,是原子性的。
  • $addToSet只能保证不会向数组当中插入已经存在的数据。而不会对数组中已经存在的重复元素产生影响。也不会对数组中元素的顺序产生影响。
  • mongodb 5.0版本以后,向$addToSet传入空表达式({ })时,mongodb不再抛出错误。空表达式不会修改字段值 ,也不会在oplog中,添加新的操作记录。
  • 使用$addToSet向不存在的数组字段添加数组元素时,mongodb会创建该字段并将元素插入到该字段当中。
  • 不可以向非数组字段插入元素,否则会报错。
  • 向数组字段插入的是一个数组时,$addToSet方法将指定的数组作为一个元素插入到数组当中。
  • 向数组字段插入文档时,mongodb会判断即将插入的文档与数组当中已有的元素是否严格相等。包括字段名称,字段值,字段顺序等。

应用

向非数组字段插入数据报错

创建pigments集合并插入数据

db.pigments.insertOne({_id: 1, colors: "blue, green, red"})

使用$addToSet向colors字段插入数组元素

db.pigments.updateOne({_id:1}, {$addToSet: {"colors": "mauve"}})
WriteError({"index" : 0,"code" : 2,"errmsg" : "Cannot apply $addToSet to non-array field. Field named 'colors' has non-array type string","op" : {"q" : {"_id" : 1},"u" : {"$addToSet" : {"colors" : "mauve"}},"multi" : false,"upsert" : false}
})

向数组字段插入数组

创建集合alphabet

db.alphabet.insertOne({_id: 1, letters: ["a", "b"]})

向letters字段,插入数组["c", "d"]

db.alphabet.updateOne({_id: 1}, {$addToSet:{"letters": ["c", "d"]}})

查看插入结果

db.alphabet.find()
{"_id" : 1,"letters" : ["a","b",[ "c", "d" ] ]
}

将数组作为一个整体插入到数组letters中。若期望将数组["c", "d"]的每一个元素插入字段letters中,使用$each操作符。

db.alphabet.updateOne({_id:1}, {$addToSet: {"letters":{$each: ["c", "d"]}}})

向数组字段中插入数据

创建集合inventory并插入数据

db.inventory.insertOne({_id:1, item: "polarizing_filter", tags: ["electronics", "camera"]})

向字段tags插入元素

db.inventory.updateOne({_id:1},{$addToSet: {tags: "accessories"}})

查询插入结果

向数组中插入已存在的元素

db.inventory.updateOne({_id:1},{$addToSet: {tags: "camera"}})

因为"camera"已经存在于数组tags当中,所以没有数据更新。

{"acknowledged" : true,"matchedCount" : 1,"modifiedCount" : 0
}


http://www.ppmy.cn/devtools/48236.html

相关文章

扩展知识:RocketMQ 如何开启 ACL 验证

扩展知识&#xff1a;RocketMQ 如何开启 ACL 验证 RocketMQ 在 4.4.0 版本开始支持 ACL 功能&#xff0c;ACL 验证的主要作用就是保证消息的安全性&#xff0c;实现权限控制功能&#xff0c;比如控制可以发送和订阅消息的群体&#xff0c;如某些主题只能被订阅&#xff0c;某些…

【机器学习】机器学习引领AI:重塑人类社会的新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀机器学习引领AI &#x1f4d2;1. 引言&#x1f4d5;2. 人工智能&#xff08;AI&#xff09;&#x1f308;人工智能的发展&#x1f31e;应用领…

无码高清?Stable DIffusion教程 | 如何利用 Stable Diffusion webui 将图片变得更清晰?全方位对比4种放大方法!

大家好&#xff0c;我是大师兄 1、引言 “高分放大”&#xff08;有时候也叫“超分放大”或“高清修复”&#xff09;描述了在确保图像清晰度的前提下提升图片分辨率的过程。例如&#xff0c;将一张512 x 512的图片放大四倍&#xff0c;得到的就是2048 x 2048分辨率的图片&am…

为什么要选择AWS?AWS的优势有哪些?

亚马逊云服务器&#xff08;Amazon Web Services&#xff0c;AWS&#xff09;是全球领先的云计算服务提供商之一&#xff0c;其提供的云服务器是在全球范围内可用的弹性计算服务。对于很多用户来说&#xff0c;他们可能会担心亚马逊云服务器是否会对服务器的使用进行限制。以下…

【Docker学习】docker login/logout

docker login和docker logout是两个相反的操作&#xff0c;分别是登入/登出注册表&#xff08;镜像仓库&#xff09;。我们一般说的公共镜像仓库&#xff08;docker hub&#xff09;是不需要登入的&#xff0c;但私有的镜像仓库通常是需要登入&#xff08;安全考虑&#xff09;…

IIS漏洞

IIS7.5解析漏洞 安装IIS7.5 安装完成之后直接访问浏览器&#xff1a; 安装phpstudy for IIS 安装这个的目的是方便&#xff0c;不用自己去配置 解压开傻瓜式安装即可。然后查看探针&#xff1a; 漏洞原理 IIS7/7.5在Fast-CGI运行模式下,在一个文件路径(/shell.jpg)后面加上/…

Building Systems with the ChatGPT API

目录 提问范式与token 评估输入--分类 检查输入--审核 审核 Prompt注入 使用恰当的分隔符 进行监督分类 处理输入--思维链推理 思维链提示设计 内心独白 处理输入--链式 提取产品和类别 检索详细信息 生成查询答案 检查结果 搭建一个带评估的端到端问答系统 提…

【网络安全的神秘世界】web应用程序安全与风险

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 第一章&#xff1a;web应用程序安全与风险 web攻击基础知识 1、什么是web应用攻击 web攻击的本质&#xff0c;就是通过http协议篡改应用程序&#xff0…