Как я могу обновить вложенные данные с помощью mon goose findByIdAndUpdate - PullRequest
0 голосов
/ 03 августа 2020

Я не могу обновить вложенные данные в моем 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 "- это то, что я хочу (это объект). Нет проблем. как вы видите выше, я могу обновить «электронную почту», потому что она находится в основной части объекта, но не могу обновить «позицию» (вложенный элемент), потому что она находится внутри basi c (заполненные данные). Я пробовал разные методы с помощью mon goose и пробовал команду «$ set». Кто-нибудь может это решить?

1 Ответ

0 голосов
/ 04 августа 2020

Чтобы обновить вложенное значение / объект в вашем документе, вы должны использовать точечную нотацию, поэтому это зависит от значения переменной req.body.

  1. req.body не должно быть Пн goose делать c. В таком случае вы 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.
...