как обновить вложенный объект в массиве с помощью nodejs с помощью mongodb?

#node.js #reactjs #mongodb #express #postman

#node.js #reactjs #mongodb #выражать #почтальон

Вопрос:

В MongoDB Моя структура базы данных выглядит следующим образом,

 [{
    "_id": "",
    "courseTitle": "",
    "courseImage": "",
    "group": [
        {
            "_id": "",
            "title": "",
            "overView": "",
            "duration": "",
            "syllabus": []
        }
    ],
 }]
 

На моем узловом js-сервере я пытаюсь обновить свою запись, используя метод put, вот мой маршрут

 router.put("/:id/:gid", (req, res) => {
let updateRecord = {
title: req.body.title,
duration: req.body.duration,
overView: req.body.overView,
syllabus: req.body.syllabus,
};
 

Я использую findOne для обновления своей записи,

 GroupCourse.findOne({ "group._id": req.params.gid }, function (error, data) {
if (error) {
  console.log(error);
  res.status(500).send();
} else {
  if (!data) {
    console.log("404");
    res.status(404).send();
  } else {
    if (data) {
      data = updateRecord;
  console.log("This is updated data", data)
    }
 

Если я console.log(данные), в данных отображаются обновленные значения.
Когда я попытался сохранить данные с помощью приведенного ниже кода, он выдает ошибку..

  data.save(function (error, updatedData) {
      if (!error) {
        console.log("This is Updated", updatedData);
         res.send(updatedData);
      }
      else {
        console.log(error);
        res.status(500).send();
      }
    });
    }
   }
 });
});
 

Я использую NodeJS, MongoDB и Postman для отправки данных отправки

Ответ №1:

Вариант 1

 GroupCourse.update({'_id': req.params.id,'group._id': req.params.gid}, 
{'$set': {
    'group.$.title': updateRecord.title,
    'group.$.duration': updateRecord.duration
}}, function(err,response) {
  // check error and response
}
 

вариант 2

 GroupCourse.findOne({'_id': req.params.id}).then(doc => {
  // can update parent
  // item.courseTitle= 'javascript'
  item = doc.group.id(req.params.gid );
  item["title"] = updateRecord.title;
  item["duration"] = updateRecord.duration;
  doc.save();

  //sent response to client
}).catch(err => {
  // error
});