如何使用findOneAndUpdate()基于原有数据单次完成数据库更新
MongoDB 单次
findOneAndUpdate实现字段自增的方案 你之前的写法无法生效是因为更新语句里不能直接引用文档自身的字段值,MongoDB提供了原生的原子运算符支持无需提前查询的更新操作:
基础方案(推荐,适用于简单增减场景)
使用$inc原子运算符,直接在数据库层完成数值累加,全程原子性无并发冲突问题:
score.findOneAndUpdate( { name: "global" }, // $inc 语法:{ 字段名: 要累加的数值,填负数就是自减 } { $inc: { score: 1 } }, // 可选参数:返回更新后的文档,默认返回更新前的旧文档 { new: true } )
通用方案(适用于所有依赖自身字段的复杂更新场景)
如果你的更新逻辑不止是简单加减(比如需要乘除、多字段联动计算等),MongoDB 4.2及以上版本支持将聚合管道作为更新参数,可直接引用文档自身字段:
score.findOneAndUpdate( { name: "global" }, [ // 用$+字段名即可引用文档原有字段值做任意计算 { $set: { score: { $add: ["$score", 1] } } } ], { new: true } )
内容的提问来源于stack exchange,提问作者LeMecWeird
相关产品推荐
相关产品推荐

