使用Mongoose查询后无法更新MongoDB数据的问题排查
问题分析与解决:MongoDB/Mongoose更新数据失败但控制台输出正确
核心错误点
异步操作未正确处理:
model.find()返回的是Mongoose的Query对象,不是直接的查询结果。你直接赋值给data并取data[0],实际是在操作Query对象而非真实的数据库文档,后续的toJSON()转换自然无效。必须用await(需确保所在函数为async)才能获取实际数据:// 修正异步查询 const data = await model.find({target: body.target});对象字面量语法错误:
构建updateObj时使用了赋值符号=,这是JavaScript对象字面量的语法错误,正确写法应该用冒号::// 修正对象键值对语法 const updateObj = { [body[str]]: parseFloat(Obj[num_1]) + parseFloat(body[num_1]) }
优化建议:避免冗余查询
你当前先查询再计算更新的方式存在并发风险(比如同一时间多个请求修改同一条数据时,会出现计算偏差),且效率低下。推荐直接用Mongoose的更新操作符完成计算:
- 如果是简单数值累加,用
$inc:await model.findOneAndUpdate( {target: body.target}, {$inc: { [body[str]]: parseFloat(body[num_1]) }}, {new: true} // 可选,返回更新后的文档 ) - 如果需要基于原字段值做复杂计算,用
$expr在更新阶段直接引用原字段:await model.findOneAndUpdate( {target: body.target}, [ {$set: { [body[str]]: {$add: ["$" + body[str], parseFloat(body[num_1])]} }} ], {new: true} )
结论
更新失败和toJSON()转换无关,主要是异步查询未处理正确,加上对象字面量的语法错误导致。修正这两个问题后,更新操作就能正常执行。
内容的提问来源于stack exchange,提问作者匿名用户
相关产品推荐
相关产品推荐

