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

Mongoose的findOneAndUpdate提示更新成功但MongoDB数据库无变更如何解决

问题核心原因

  • 你的更新参数写法错误:代码中传入的第二个参数是{updatedUser},这是ES6对象属性简写语法,等价于{ updatedUser: updatedUser },相当于你是要给文档新增一个名为updatedUser的嵌套对象字段,而不是把updatedUser里的字段直接更新到文档根层级,这就是为什么加了strict: false之后只会新增一个对象,而原有字段没有变化。
  • 附加潜在问题:你没有开启返回更新后文档或者校验匹配结果的配置,默认情况下findOneAndUpdate不会在没有匹配到对应_id的文档时抛出错误,你只判断了err是否存在,没有判断是否真的匹配到了要更新的文档,可能存在_id传错没有匹配到文档的情况也会提示更新成功。

解决建议

  1. 修正更新参数写法,直接传入updatedUser对象本身,不要在外层套大括号,参考代码如下:
// 修正后的代码
User.findOneAndUpdate(
  {_id: req.body.id}, 
  updatedUser, // 去掉外层的{},直接传更新字段对象
  {
    useFindAndModify: false,
    new: true, // 返回更新后的文档,方便校验结果
    runValidators: true // 开启schema字段校验,避免非法数据写入
  }, 
  (err, doc) => {
    if(!err){
      if(!doc) {
        // 没有匹配到对应_id的文档,返回对应提示
        return res.json({message: "未找到对应用户,更新失败"})
      }
      console.log("Managed to update")
      res.json({message: "用户更新成功", data: doc})
    } else {
      res.json({message: `操作失败,请重试 => ${err} `})
    }
})
  1. 如果你的updatedUser里不包含schema以外的字段,可以去掉之前加的strict: false配置,避免多余字段写入。
  2. 可以提前校验req.body.id是否为合法的MongoDB ObjectId格式,避免发起无效查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:03