当前位置: 首页 > news >正文

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

学习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
}

相关文章:

  • 设备驱动程序和 PCI 电源管理
  • 健身行动日
  • 如何生成自定义二维码和实现安全便捷的扫码登录功能以及对接企业微信API
  • 打破安全设备孤岛,多源威胁检测与响应(XDR)如何构建一体化安全防线
  • 51单片机入门
  • AWS无服务器 应用程序开发—第三章 后端服务(AWS AppSync)
  • 秋招突击——6/16——复习{整理昨天的面试资料}——新作{删除链表倒数第n个节点}
  • 信用VS抵押:贷款的两面镜子
  • Linux(Centos7)OpenSSH漏洞修复,升级最新openssh-9.7p1
  • 英语恶补ing
  • MAP REDUCE
  • vue3的基本使用方法
  • “Jedis与Redis整合指南:实现高效的Java应用与Redis交互“
  • 示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选
  • 【PB案例学习笔记】-22制作一个语音朗读金额小应用
  • [译] 怎样写一个基础的编译器
  • 《深入 React 技术栈》
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js中的正则表达式入门
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • nodejs:开发并发布一个nodejs包
  • PAT A1050
  • Redux系列x:源码分析
  • 编写符合Python风格的对象
  • 给github项目添加CI badge
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 什么软件可以剪辑音乐?
  • 树莓派 - 使用须知
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 2017年360最后一道编程题
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​渐进式Web应用PWA的未来
  • ​力扣解法汇总946-验证栈序列
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)Jupyter Notebook 下载及安装
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (javascript)再说document.body.scrollTop的使用问题
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (一)Java算法:二分查找
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)关于pipe()的详细解析
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • *Django中的Ajax 纯js的书写样式1
  • .NET CLR Hosting 简介
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现