You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:42:02