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
}
相关推荐
Htr_3 分钟前
Creem 2.0 使用指南:面向 AI 构建时代的资金平台
android·数据库·人工智能·ui·photoshop
我是大猴子8 分钟前
reids的数据结构的应用场景
数据库
hanlin0326 分钟前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode
金士曼27 分钟前
从规则到涌现:算法认知的三个层次
算法
螺蛳粉 螺蛳粉31 分钟前
mysql的备份与恢复
linux·运维·数据库·mysql
艾醒(AiXing-w)1 小时前
LangChain 1.0 智能体开发(三):Agent 记忆管理——从短期对话到跨会话长期记忆
数据库·人工智能·langchain
MSTcheng.1 小时前
KES 进了 K8s 之后运维归谁管?
数据库
AgentMaster1 小时前
数据资产化落地难题:5款数据中台系统架构对比与实施记录
大数据·人工智能·算法
知识的搬运工旺仔2 小时前
CREATE INDEX CONCURRENTLY:线上建索引不阻塞 DML 的代价与坑
数据库·后端·sql
鹿角片ljp2 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法