为何这条路由无法更新数据库中的数据?
问题分析与解决
你这儿的问题是调用updateOne后文档没更新,但没报错,核心原因是错误使用了Mongoose文档实例的updateOne方法。
问题出在哪
你已经通过await ApartmentsModel.findById(req.body._id)拿到了对应的apartment文档实例,这时候调用实例的updateOne根本不需要再传过滤器({ "_id": ObjectId(id)})——这个实例本身就绑定了具体的文档,你额外加的过滤器反而画蛇添足,导致更新没作用到目标文档上。
两种修正方法
方法一:直接用实例的save()(推荐,适合已经拿到实例的情况)
既然已经拿到了apartment实例,直接改它的comments属性再存回去就行:
router.post("/update", async (req,res) => { try { const apartment = await ApartmentsModel.findById(req.body._id); apartment.comments = req.body.comments; // 直接修改实例的comments字段 const response = await apartment.save(); // 保存更新到数据库 res.json(response); } catch (err) { res.json(err) } });
方法二:用Model的updateOne(不用提前查实例)
如果不需要先读实例的其他数据,直接用模型的updateOne更高效,这时候才需要传过滤器:
// 先确保导入了ObjectId:const { ObjectId } = require('mongoose'); router.post("/update", async (req,res) => { const id = req.body._id; const comments = req.body.comments; try { const response = await ApartmentsModel.updateOne( { "_id": ObjectId(id)}, // 模型方法需要传过滤器定位文档 { $set: { comments: comments } } ); res.json(response); } catch (err) { res.json(err) } });
额外说明
你之前的代码里,console.log(comments)能输出正确值,apartment实例也能正常获取,说明参数传递和查询都没问题,就是updateOne的用法错了才导致更新失效。
内容的提问来源于stack exchange,提问作者jpjp2000
相关产品推荐
相关产品推荐

