Mongoose如何通过findOneAndUpdate实现views字段原子自减操作
错误原因
你报错是因为{views: views--}里的views被识别为JavaScript变量,你没有提前声明该变量自然会抛出未定义错误,同时这种写法也不能直接引用数据库当前存储的views字段值做运算,需要用MongoDB内置的原子更新操作符实现。
正确代码(和你原逻辑完全对齐,保留随机skip规则)
const a1 = await model.findOneAndUpdate( { type: 3 }, { $inc: { views: -1 } }, { new: true } ).skip(random) return a1
说明
$inc是MongoDB专用的增量更新操作符,传入负值就可以实现字段自减的效果,而且属于原子操作,比你先查询再修改再保存的写法更适合高并发场景,不会出现多请求同时修改导致的计数不准问题。
如果是适配其他关系型数据库(比如MySQL),对应写法可以直接在更新语句里写views = views - 1即可,不需要额外操作符。
内容的提问来源于stack exchange,提问作者thelittlemaster
相关产品推荐
相关产品推荐

