$setOnInsert(插入时设置)

最后更新:2026-10-09

$setOnInsert(插入时设置)

$setOnInsert 只在 upsert 触发插入新文档时设置字段值;若匹配到已有文档,该操作符被忽略。`{ $setOnInsert: { createdAt: new Date() } }`。常与 upsert: true 配合记录文档创建时间、初始化默认值,实现「有则不动、无则初始化」的语义。

分类更新字段
MongoDB 版本1.0+
示例语言mongosh (Shell)

📝 语法

{ $setOnInsert: { <字段>: <值> } }

⚙️ 参数

字段只在插入时设置的字段名。
值初始化值,如创建时间。

返回值:更新结果文档

▶ 示例

请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):

// $setOnInsert:新文档才写入 createdAt
// 已有文档更新时被忽略
db.users.updateOne(
  { email: 'alice@example.com' },
  {
    $set: { name: 'Alice' },
    $setOnInsert: { createdAt: new Date() }
  },
  { upsert: true }
)

运行结果:

// 首次插入时 createdAt 被记录;后续更新不会改动它

📌 注意事项

📚 相关教程

❓ 常见问题

Q$setOnInsert 什么时候生效?
A只在 upsert 实际插入新文档时生效,更新已有文档时被忽略。
Q$setOnInsert 和 $set 能一起用吗?
A能,$set 每次生效,$setOnInsert 只在插入时生效。
Q必须配 upsert: true 吗?
A是,否则纯更新场景下它永不生效。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏