Express操作MongoDB时updateOne未解析_action变量值求助
问题原因与解决方法
原因
你在构造MongoDB更新对象时用了普通对象字面量写法{ _action : up },在JavaScript里这种写法会把_action当作固定字符串键名,而不是读取变量_action的实际值(也就是你传入的$push)。这就导致传给updateOne的更新对象键是"_action",而非你需要的$push,自然没法触发正确的更新操作。
解决方法
要动态用变量作为对象键名,必须使用方括号语法——把变量放在方括号里,JavaScript会自动将变量求值后的结果作为键名。
修改后的核心代码如下:
function UpData(chk, _action, up){ // 用方括号语法解析_action变量的值作为键名 Employee.updateOne(chk, { [_action]: up }) .then(data => { if (!data.matchedCount) { res.status(404).send({ message: `Cannot update Employee with id=${chk._id}. Maybe Employee was not found!` }); } else res.send({ message: "Absence is added successfully." }); }) .catch(err => { res.status(500).send({ message: "Error updating Employee with id=" + chk._id }); }); }
同步修改日志代码,才能正确输出预期对象:
console.log(chk, { [_action]: up }) console.log(_action)
修改后日志会输出:
{ _id: '691fa64', 'absences.ab_id': 'MEk' } { $push: { 'absences.$.ab_comments': { comment: 'K1' } } } $push
额外提示
你的代码里还有一处小问题:原错误信息中使用的id变量未定义,建议改用chk._id获取目标文档ID;同时判断更新是否成功时,应该用data.matchedCount(MongoDB驱动返回的结果对象中,matchedCount表示匹配到的文档数量),而非直接判断!data(updateOne总会返回结果对象,不会是null或undefined)。
内容的提问来源于stack exchange,提问作者nyla L
相关产品推荐
相关产品推荐

