findByIdAndUpdate возвращает 200 ответов, но не обновляется

#mongodb #express #mongoose

#mongodb #выразить #mongoose

Вопрос:

Отправка запроса put с помощью findAndUpdateById, который возвращает 200 ответов в postman — но данные не обновляются.

Запрос put является

 app.put("/api/report/update/:id", (req, res) => {
  Report.findByIdAndUpdate(
    req.params.id,
    req.body.data,
    { new: true },
    (err, report) => {
      if (err) return res.status(404).send({ message: err.message });
      return res.send({ message: "report updated!", report });
    }
  );
});
  

Форма отправляемых данных такова

     report: {
            month: "",
            updateMajor: "",
            updateMinor: "",
            comments: {
              comment1: "",
              comment2: "",
              comment3: ""
            },
          }
  

Данные возвращаются точно в том виде, в каком они были отправлены.

Спасибо за любую помощь.

Комментарии:

1. Проверьте содержимое в req.body с помощью console.log(req.body) , скорее всего, оно содержит не то, что вы ожидаете.

Ответ №1:

вам нужно использовать какой-нибудь update оператор, такой как $set , $unset , $push и т.д. в вашем запросе на обновление. поскольку вы не используете ни один из них, вы получаете такое поведение.

Если вы просто хотите установить значение, которое вы отправляете, попробуйте использовать его с $set .

Попробуйте это:

   Report.findByIdAndUpdate(
    req.params.id,
    {$set : req.body.data } ,
    { new: true },
    (err, report) => {
      if (err) return res.status(404).send({ message: err.message });
      return res.send({ message: "report updated!", report });
    }
  );
  

Примечание: $set переопределяет предыдущее значение.

Если вам нужно что-то еще, пожалуйста, ознакомьтесь с подробной информацией в Документации операторов обновления MongoDB

Комментарии:

1. На самом деле использование mongoose (как и вопрос на самом деле) $set подразумевается и автоматически добавляется к фактическому заявлению, отправленному в MongoDB. Вы можете увидеть это с помощью mongoose.set('debug', true) . Так что нет, проблема не в этом.

2. $ set сработал, мне также пришлось отправлять по каждому полю и значению вместо body.data