MongoDB文档字段数值累加操作无报错但不生效问题咨询
问题排查及解决方案
- 确认查询是否匹配到有效文档
你调用schema.findOne({ Main:'Main' })如果没有匹配的文档会返回null,此时对null的属性进行赋值操作理论上会抛出TypeError,如果你没有看到任何报错,大概率是外层代码包裹了未打印错误的try/catch,把异常直接吞掉了。你可以在拿到data之后加一行console.log(data)确认是否真的查到了目标文档。 - 手动标记字段已修改
部分场景下Mongoose的自动脏检查会失效,比如字段是混合类型、或者赋值操作没有触发Mongoose的setter监听,你可以在修改字段之后、调用save之前手动标记字段为已修改:
const schema = require('./commands/serverstats') const data = await schema.findOne({ Main:'Main' }) data.TotalBobuxGiven += Number(args[0]) data.TotalRobuxGiven += Number(args[1]) // 新增以下两行标记字段变更 data.markModified('TotalBobuxGiven') data.markModified('TotalRobuxGiven') await data.save() message.reply(`Done`) console.log('done')
- 推荐改用原子更新操作
查改存的写法不仅有并发冲突风险,性能也更低,你可以直接用MongoDB的$inc原子操作符完成累加,不需要先查文档:
const schema = require('./commands/serverstats') await schema.updateOne( { Main: 'Main' }, { $inc: { TotalBobuxGiven: Number(args[0]), TotalRobuxGiven: Number(args[1]) } }, { upsert: true } // 不存在匹配文档时自动创建,按需开启 ) message.reply(`Done`) console.log('done')
这个写法会直接在数据库层面完成累加,你也可以通过返回的更新结果判断是否有文档被匹配修改。
内容的提问来源于stack exchange,提问作者Bob joe12
相关产品推荐
相关产品推荐

