讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬浩君_1838

冬浩君_1838

发布时间:2026-09-02 09:20:29

|

765人浏览过

|

来源于php中文网

原创

$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)判断是否已存在。只要值完全一致,就跳过插入。

  • 基本类型(字符串、数字、布尔)没问题:"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 几乎总是不如手动控制可靠。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

695

2023.07.18

mongodb启动命令
mongodb启动命令

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

2254

2023.08.08

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

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

2104

2023.09.19

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

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

4009

2023.11.02

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

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

938

2024.04.02

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

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

6212

2024.04.02

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

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

575

2024.04.02

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

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

1849

2024.04.02

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

0

2026.09.22

热门下载

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

精品课程

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

共17课时 | 6.2万人学习

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

共11课时 | 3.5万人学习

MongoDB 教程
MongoDB 教程

共42课时 | 61.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn