$addToSet(去重添加)
最后更新:2026-10-09
$addToSet(去重添加)
$addToSet 向数组字段添加元素,仅当元素不存在时才添加,保证数组内无重复值。`{ $addToSet: { tags: 'mongodb' } }`。要一次添加多个元素需配合 $each。重复判断基于完整值相等(嵌套文档逐字段比较)。适合维护标签、关注列表等唯一集合。
| 分类 | 更新数组 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $addToSet: { <数组字段>: <值> } }
⚙️ 参数
| 数组字段 | 要添加元素的数组字段名。 |
|---|---|
| 值 | 要添加的值,已存在则跳过。 |
返回值:更新结果文档
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $addToSet:添加标签(已存在则跳过)
db.articles.updateOne(
{ _id: 1 },
{ $addToSet: { tags: 'mongodb' } }
)
// 批量添加需 $each
db.articles.updateOne(
{ _id: 1 },
{ $addToSet: { tags: { $each: ['database', 'nosql'] } } }
)
运行结果:
// tags 中已存在 mongodb 时不重复添加;database 与 nosql 依次追加
📌 注意事项
- 重复判断基于值完全相等
- 一次多个值必须用 $each
- 字段不存在时创建数组;非数组字段报错
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
Q$addToSet 和 $push 的区别?
A$addToSet 去重,$push 直接追加可重复。
Q怎么一次添加多个值?
A配合 $each:{ $addToSet: { tags: { $each: ['a', 'b'] } } }。
Q$addToSet 能加嵌套文档吗?
A能,按整个文档是否相等判断去重。