MongoDB中updateOne操作的$setOnInsert参数无法生效问题求助
问题根因
$setOnInsert 操作符的生效逻辑为仅当 upsert 操作触发新文档插入时才会执行配置的赋值操作,如果查询条件匹配到了已存在的文档,$setOnInsert 会被直接跳过。
你本次操作的返回结果中 matchedCount: 1、upsertedCount: 0,说明已经匹配到了已有的目标文档,没有触发插入逻辑,因此 createAt 字段不会被新增,属于符合设计预期的表现。
对应解决方案
根据你的实际需求可以选择以下两种处理方案:
- 需求为「仅后续新插入的文档自动带上
createAt字段,已存在的文档不需要补字段」:你当前的操作写法无需修改,后续插入新文档时$setOnInsert会自动生效写入字段。 - 需求为「已存在的文档如果缺失
createAt就补上,同时后续新插入的文档也自动带该字段」:先执行一次全量补字段的更新,再保留原有 upsert 逻辑即可:// 给所有缺失createAt的已有文档补字段,可根据需要调整时间值 db.blog.posts.updateMany( { createAt: { $exists: false } }, { $set: { createAt: new Date() } } ) // 后续的upsert操作继续保留原有写法即可 db.blog.posts.updateOne( {_id: ObjectId("6199f4a6e441680652333cbc")}, {"$setOnInsert" : {"createAt" : new Date()}}, {"upsert" : true} )
内容的提问来源于stack exchange,提问作者redchicken
相关产品推荐
相关产品推荐

