MongoDB执行PUT操作后truckIds数组被清空的问题求助
问题根源&修复方案:更新Signup后truckIds被清空的问题
嘿,我一眼就看出问题出在哪了——你用new Signup()创建了一个新的实例来做更新,这会把原文档里没在新实例中定义的字段都给覆盖掉!
为什么会出现这个问题?
当你执行new Signup({ _id: req.params.signupId, approved: req.body.approved })时,这个新实例里只有_id和approved两个属性,像truckIds、userId这些字段都没被赋值。而你的Schema里truckIds是必填的数组类型,Mongoose会自动把未定义的truckIds转换成空数组。之后你把这个实例传给updateOne,MongoDB会用这个新对象完全替换原文档,自然就把原来的truckIds数据给清空了。
怎么修复?
咱们直接只更新需要修改的字段就行,别创建完整的实例,两种方法都可以:
方法1:直接传递更新字段对象给updateOne
exports.chooseTransporter = (req, res, next) => { // 只传要更新的approved字段,其他字段保持不变 Signup.updateOne( { _id: req.params.signupId }, { approved: req.body.approved } ) .then(result => { res.status(201).json({ message: "Signup updated!", result: result }); }) .catch(err => { res.status(500).json({ message: "DB error!" }); }); }
方法2:用findByIdAndUpdate更直观(还能返回更新后的文档)
如果你想拿到更新后的完整文档,或者需要触发Schema的验证规则,可以用这个方法:
exports.chooseTransporter = (req, res, next) => { Signup.findByIdAndUpdate( req.params.signupId, { $set: { approved: req.body.approved } }, // 用$set确保只更新指定字段 { new: true, runValidators: true } // new: true 返回更新后的文档;runValidators: true 执行验证 ) .then(updatedSignup => { res.status(201).json({ message: "Signup updated!", result: updatedSignup }); }) .catch(err => { res.status(500).json({ message: "DB error!" }); }); }
这两种方法都只会修改approved字段,其他字段(包括truckIds)都会保留原来的数据,完美解决你的问题~
内容的提问来源于stack exchange,提问作者nbalog
相关产品推荐
相关产品推荐

