MongoDB是否有与MySQL的ON DUPLICATE KEY UPDATE等效的实现?
MongoDB 等效 MySQL ON DUPLICATE KEY UPDATE 的实现方式
MongoDB 完全支持「不存在则插入、存在则结合新旧值更新」的逻辑,不需要依赖单独的插入语法,通过更新方法配合upsert参数和更新运算符即可实现,灵活度比MySQL更高。
对应示例场景的写法
你给出的MySQL示例是:当唯一键冲突时,将原有col1的值和新传入的col1值累加,等效MongoDB实现如下:
// 假设 col2 为集合的唯一索引字段,新传入的值为 col1=10、col2="targetValue" db.collectionName.updateOne( // 第一步:指定重复判断条件,对应MySQL唯一键匹配逻辑 { col2: "targetValue" }, // 第二步:指定更新规则 { // $inc 运算符直接完成累加操作,等效 col1 = 原有col1 + 新值10 $inc: { col1: 10 }, // $setOnInsert 内的字段仅在插入新文档时生效,更新时不修改 $setOnInsert: { col2: "targetValue" } }, // 第三步:开启upsert,无匹配记录时自动插入新文档 { upsert: true } )
其他常见更新场景扩展
如果需要做数值累加以外的自定义运算(比如字符串拼接、数组追加等),可以配合聚合更新语法实现,示例如下:
// 场景:唯一键匹配时,将原有strCol字段拼接新的后缀,无匹配则插入新文档 db.collectionName.updateOne( { uniqueCol: "uniqueValue" }, [ { $set: { strCol: { $concat: ["$strCol", "-newSuffix"] } } }, { $setOnInsert: { uniqueCol: "uniqueValue", strCol: "defaultValue" } } ], { upsert: true } )
注意事项
- 必须提前给用于判断重复的字段创建唯一索引,和MySQL需要唯一索引才会触发重复冲突的逻辑一致,否则会出现重复插入的问题。
- 批量操作场景可以使用
updateMany或者bulkWrite方法,性能更优。
内容的提问来源于stack exchange,提问作者LF-DevJourney
相关产品推荐
相关产品推荐

