Mongoose中如何在findOneAndUpdate查询中使用文档自身值更新字段
实现方案
直接使用MongoDB原生的原子操作符$inc即可,不需要提前查询用户当前积分,该操作会直接在数据库层面完成数值累加,天然避免并发场景下的竞态问题。
原写法问题
你示例中的写法需要先查询出用户当前的积分值再做更新,属于两步操作,高并发场景下会出现更新丢失的问题:比如两个请求同时查询到同一个用户的积分为100,分别加100后更新,最终积分只会变成200而不是预期的300。
正确代码示例
await User.findByIdAndUpdate( userId, // $inc 后跟要修改的字段和对应增量,增量为负就是扣减 { $inc: { points: 100 } }, { new: true, runValidators: true } )
补充说明
- 如果需要扣减积分,直接把增量改成负数即可,比如扣50积分就写
{ $inc: { points: -50 } } - 注意字段名要和Schema里定义的保持一致,不要写错成示例里的
loyaltyPoints,否则更新不会生效 - 该操作是原子性的,性能比「先查再改」的方案高很多,是数值累加/扣减场景的标准实现方式
内容的提问来源于stack exchange,提问作者UAhmadSoft
相关产品推荐
相关产品推荐

