我无法更新mongodb中的嵌套数据。这是我在后端的“更新”模块。
exports.updateOne = (req, res) => {
if (!req.body) {
return res.status(400).send({
message: "Data to update can not be empty!"
});
}
const {id} = req.params;
console.log(req.body);
User.findByIdAndUpdate(id, req.body, { useFindAndModify: false, new: true}).populate('basic')
.then(data => {
if (!data) {
res.status(404).send({
message: `Cannot update User with id=${id}. Maybe User was not found!`
});
} else
res.send({ message: "User was dupdated successfully." , data});
})
.catch(err => {
res.status(500).send({
message:
err.message || "Error updating User with id=" + id
});
});
};
我的前端是;
onChangePosition(e) {
const position = e.target.value;
this.setState(prevState => ({
currentStaff: {
...prevState.currentStaff,
basic:
{
...prevState.currentStaff.basic,
position:position
}
}
}));
}
onChangeEmail(e) {
const emailBusiness = e.target.value;
this.setState(prevState => ({
currentStaff: {
...prevState.currentStaff,
emailBusiness:emailBusiness
}
}));
}
updateStaff() {
StaffDataService.updateOne(
this.state.currentStaff.id,
this.state.currentStaff
).then(response => {
console.log(response.data);
})
.catch(e => {
console.log(e);
})
}
我可以正确更改状态,而我发送的数据“ req.body”正是我想要的(它是一个对象)。没有问题。 如上所示,我可以更新“电子邮件”,因为它位于对象的主体上,但是不能更新“位置”(嵌套元素),因为它位于基本(填充数据)内部。 我用猫鼬尝试了不同的方法,并尝试了“ $ set”命令。 谁能解决这个问题?
答案 0 :(得分:0)
要更新文档中的嵌套值/对象,应使用点符号,因此它取决于req.body
变量值。
req.body
不应是Mongoose文档。在这种情况下,您mongoose.toObject
。
第二件事是:
[更新]对象应为:field_with_subdocument.key_value: updated_propery
像这样:
/** Example doc */
{
_id: 1,
parent_field: {
baby_field: value
}
}
/** Inside async function */
...await Model.findByIdAndUpdate(id, { "parent_field.baby_field": value })
Also, take a look at [`{overwrite: true}`](https://mongoosejs.com/docs/api/model.html#model_Model.findByIdAndUpdate) option. It might be useful to you.