MongoDB中$push与$addToSet有什么区别?

冬浩君_1838

冬浩君_1838

2026-09-02

765人浏览

原创

$addtoset仅对bson全等值去重,基础类型正常,但嵌套文档需字段顺序、类型、值完全一致才视为重复;按业务字段(如uid)去重须改用应用层控制或$pull+$push组合。

mongodb中$push与$addtoset有什么区别?

$push 无条件追加,$addToSet 只在值不存在时插入 —— 但“存在”的判定规则很关键,容易误判。

$push 就是往数组末尾硬塞一个新元素

不管字段是否存在、数组是否为空、值是否已存在,$push 都直接追加。它不查重,也不关心语义。

  • 如果目标字段不存在,会自动创建一个数组并插入值
  • 如果字段已存在且是数组,就在末尾添加新元素(哪怕和已有元素完全一样)
  • 如果字段存在但不是数组,操作会失败,报错 Cannot apply $push to a non-array value
  • 对嵌套文档使用 $push 时,整个文档必须完全相等才算重复 —— 顺序、键名、缺失字段都影响判断

$addToSet 看似去重,但只对“全等值”生效

$addToSet 不是按业务逻辑去重,而是按 BSON 值全等(strict equality)判断是否已存在。只要值完全一致,就跳过插入。

FaceSwapper
FaceSwapper

FaceSwapper是一款支持照片、视频和 GIF 换脸的在线 AI 换脸工具。

下载
  • 基本类型(字符串、数字、布尔)没问题:"tag" 已在数组里,再 $addToSet 同值不会重复
  • 数组类型也支持:但要求元素个数、顺序、每个元素值都一致才视为重复
  • **嵌套文档最易踩坑**:{uid: 10001, addtime: 1532676854771}{uid: 10001, addtime: 1532676854770} 被认为是两个不同文档,即使 uid 相同也会被同时插入
  • 字段顺序不同也算不同文档:{a: 1, b: 2}{b: 2, a: 1}

想真正按某个字段去重?别依赖 $addToSet

当你要基于 uid 去重好友、基于 email 去重订阅者,$addToSet 无法满足 —— 它没法只比对子字段。

  • 常见错误写法:$addToSet: { friends: { uid: 10001, addtime: ... } } → 多次调用会累积多个相同 uid 的记录
  • 正确思路:先 $pull 掉旧的,再 $push 新的;或用 $set + 数组索引更新(需配合 $ 操作符)
  • 聚合阶段可用 $reduce$group 实现逻辑去重,但不能用于 update
  • 应用层控制更稳妥:读出当前数组 → 过滤掉已有 uid → 构造新数组 → $set 整体替换

批量添加时 $each 的行为差异

两者都支持 $each,但结果逻辑不同:

  • $push: { tags: { $each: ["a", "b", "c"] } } → 总是追加全部三个值,不管原来有没有
  • $addToSet: { tags: { $each: ["a", "b", "c"] } } → 对每个值单独做存在性检查,只插入那些不在数组里的
  • 注意:$addToSet + $each 不会把整个输入数组当一个元素插进去;而漏掉 $each 直接写 $addToSet: { tags: ["a","b"] } 会把 ["a","b"] 当成一个嵌套数组插进去

真正麻烦的从来不是语法,而是你心里以为的“重复”和 MongoDB 认为的“重复”根本不是一回事。尤其处理带时间戳或动态字段的嵌套文档时,$addToSet 几乎总是不如手动控制可靠。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mongodb

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

695

5

mongodb启动命令
mongodb启动命令

MongoDB 是一种开源的、基于文档的 NoSQL 数据库管理系统。本专题提供mongodb启动命令的文章,希望可以帮到大家。

2023.08.08

2254

5

MongoDB删除数据的方法
MongoDB删除数据的方法

MongoDB删除数据的方法有删除集合中的文档、删除整个集合、删除数据库和删除指定字段等。本专题为大家提供MongoDB相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.19

2104

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4009

19

mongodb有哪些应用领域
mongodb有哪些应用领域

mongodb 的应用领域涵盖广泛,包括内容管理系统、社交媒体、分析、移动应用、物联网、金融科技、医疗保健和广告技术等领域,因其灵活性、可扩展性和易用性而广受欢迎。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

938

6

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6212

6

mongodb安装失败如何彻底删除
mongodb安装失败如何彻底删除

彻底删除 mongodb 安装失败的步骤:1、停止和禁用 mongodb 服务;2、删除配置文件、数据目录和日志文件;3、删除 mongodb 二进制文件;4、卸载 mongodb 套件(如果通过软件包管理器安装);5、删除 mongodb 用户、组和目录;6、重启系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

575

6

mongodb与mysql好用推荐
mongodb与mysql好用推荐

mongodb 适用于非结构化数据、高扩展性和灵活查询(如网站内容管理、社交媒体),而 mysql 适用于结构化数据、强数据一致性和联接查询(如电子商务、银行系统)。

2024.04.02

1849

9

mongodb数据库的优势有哪些
mongodb数据库的优势有哪些

mongodb 数据库以其灵活、可扩展和高性能而闻名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

2051

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 6.2万人学习

黑马云课堂mongodb实操视频教程
黑马云课堂mongodb实操视频教程

共11课时 | 3.5万人学习

MongoDB 教程
MongoDB 教程

共42课时 | 61.2万人学习