我如何使用猫鼬findByIdAndUpdate更新嵌套数据

时间:2020-08-03 20:44:08

标签: javascript reactjs mongodb mongoose mongoose-populate

我无法更新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”命令。 谁能解决这个问题?

1 个答案:

答案 0 :(得分:0)

要更新文档中的嵌套值/对象,应使用点符号,因此它取决于req.body变量值。

  1. req.body不应是Mongoose文档。在这种情况下,您mongoose.toObject

  2. 第二件事是:

    [更新]对象应为: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.