Mongoose的findOneAndUpdate提示更新成功但MongoDB数据库无变更如何解决
问题核心原因
- 你的更新参数写法错误:代码中传入的第二个参数是
{updatedUser},这是ES6对象属性简写语法,等价于{ updatedUser: updatedUser },相当于你是要给文档新增一个名为updatedUser的嵌套对象字段,而不是把updatedUser里的字段直接更新到文档根层级,这就是为什么加了strict: false之后只会新增一个对象,而原有字段没有变化。 - 附加潜在问题:你没有开启返回更新后文档或者校验匹配结果的配置,默认情况下
findOneAndUpdate不会在没有匹配到对应_id的文档时抛出错误,你只判断了err是否存在,没有判断是否真的匹配到了要更新的文档,可能存在_id传错没有匹配到文档的情况也会提示更新成功。
解决建议
- 修正更新参数写法,直接传入
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} `}) } })
- 如果你的
updatedUser里不包含schema以外的字段,可以去掉之前加的strict: false配置,避免多余字段写入。 - 可以提前校验
req.body.id是否为合法的MongoDB ObjectId格式,避免发起无效查询。
内容的提问来源于stack exchange,提问作者user15393979
相关产品推荐
相关产品推荐

