如何在MongoDB中实现字段仅允许设置一次的功能?
MongoDB实现timestamp字段不存在时才写入的操作方案
基础实现逻辑
不需要额外写业务代码做存在性判断,直接利用MongoDB自带的查询条件和更新操作符即可实现原子化操作,完全避免并发冲突。
场景1:更新已有文档,仅timestamp缺失时才写入
把「timestamp字段不存在」作为查询筛选条件的一部分,匹配不到符合条件的文档时自然不会执行更新操作,天然满足「存在则不改动」的要求。
Mongo Shell示例代码:
db.你的集合名.updateOne( // 第一个参数:查询条件,匹配目标文档+timestamp不存在 { _id: ObjectId("目标文档的ID"), timestamp: { $exists: false } }, // 第二个参数:要写入的timestamp值 { $set: { timestamp: ISODate("你要写入的时间值") } } )
- 如果需要批量更新集合内所有缺失timestamp的文档,把
updateOne替换为updateMany,去掉_id匹配条件即可 - 如果需要排除timestamp值为
null的场景,查询条件可以调整为{ timestamp: { $not: { $type: 10 } } }(10是MongoDB中null类型的编号)
场景2:upsert场景(文档不存在则插入,存在则仅timestamp缺失时写入)
配合$setOnInsert操作符实现,仅当插入新文档时才会写入timestamp字段,更新已有文档时该操作符不生效,不会覆盖已有的timestamp值。
Mongo Shell示例代码:
db.你的集合名.updateOne( // 第一个参数:匹配业务唯一键 { 业务唯一键: "对应的值" }, { // 仅插入新文档时生效 $setOnInsert: { timestamp: ISODate("你要写入的时间值") }, // 其他需要不管文档是否存在都更新的字段放在普通$set中 $set: { 其他字段: "对应的值" } }, // 开启upsert模式 { upsert: true } )
内容的提问来源于stack exchange,提问作者Pinkhron
相关产品推荐
相关产品推荐

