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

Mongoose调用findOneAndUpdate更新MongoDB数据不生效如何解决?

问题原因

  • findOneAndUpdate为异步方法,你当前代码未通过await或回调等待方法执行完成,更新逻辑在触发后没有实际完成执行就被中断了。
  • 先查询再更新的冗余逻辑存在竞态风险,可通过内置参数简化避免。

修复方案

推荐直接使用findOneAndUpdate的upsert参数,单方法同时实现「不存在则新建、存在则更新」的逻辑,无需拆分两次数据库操作:

await muteSchema.findOneAndUpdate(
  { guildId: message.guild.id },
  { 
    guildId: message.guild.id,
    roleId: role.id 
  },
  { 
    upsert: true, // 匹配不到对应guildId的文档时自动新建
    new: true // 可选配置,开启后返回更新后的最新文档
  }
).catch(err => console.log(err))

如果你要保留原有先查询再更新的写法,只需要给findOneAndUpdate加上await等待异步执行完成即可:

muteSchema.findOne(
  {
    guildId: message.guild.id
  }, async (err, data) => {
    if(err) console.log(err)
    if(data)
    {
      // 新增await等待更新操作执行完成
      await muteSchema.findOneAndUpdate(
        {
          guildId: data.guildId
        },
        {
          guildId: message.guild.id,
          roleId: role.id
        }
      ).catch(err => console.log(err))
    }
    else
    {
      data = new muteSchema(
        {
          guildId: message.guild.id,
          roleId: role.id
        }
      )
      data.save().catch((err) => console.log(err) )
    }
  }
)

内容的提问来源于stack exchange,提问作者hajajdvshskaja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:27:02