Не удается создать несколько значений в массиве объектов mongo

#javascript #mongodb #mongoose-schema #insomnia

Вопрос:

Я пытаюсь сохранить несколько значений в MongoDB в поле встречи, это моя схема:

 const MeetingSchema = new mongoose.Schema({
  meetings: [
    {
      name: { type: String, require: true, trim: true },
      timer: { type: Number, require: true, trim: true },
    },
  ],
  date: { type: Date, default: Date.now, trim: true },
  responsible: { type: String, require: true, trim: true },
}); 

Мой контроллер:

 const { name, timer } = req.body;
      const response = await MeetingModel.create({
        meetings:
          {
            name: name,
            timer: timer,
          },
 
      });

return res.status(201).json(response); 

Это основная часть моей просьбы, которую я сделал по поводу бессонницы:

 {
    "name": "Meeting Name",
    "timer": 100,

    "name": "Meeting Name2",
    "timer": 400
} 

Результат:

 {
  "meetings": [
    {
      "name": "Meeting Name2",
      "timer": 400,
      "_id": "615618effd96b823d2cf741b"
    }
  ],
  "_id": "615618effd96b823d2cf741a",
  "date": "2021-09-30T20:07:11.344Z",
  "__v": 0
} 

Как вы можете видеть, я пытаюсь сохранить несколько данных на собраниях, а не только последние.

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

1. Запрос переопределяет имя и значения таймера. Это должен быть массив, если вы хотите хранить несколько значений. И при получении массива контроллер должен быть обновлен, чтобы ожидать его.

2. Моя схема-массив, но все еще не работает.. и, как вы можете видеть, мой результат-массив объектов.

Ответ №1:

 const { name, timer } = req.body;
  const response = await MeetingModel.create({
   $push{ 
     meetings:
      {
        name: name,
        timer: timer,
      }
    }

  });

 return res.status(201).json(response);
 

Когда вы обновляете массив, вам нужно добавить $push для добавления и $pull для удаления
Ссылка: Дополнительная информация

Ответ №2:

Запрос, который вы отправляете

 {
    "name": "Meeting Name",
    "timer": 100,

    "name": "Meeting Name2",
    "timer": 400
}
 

переписывает значение для имени и таймера. Это должен быть массив объектов, а не сам объект, еще меньше следует переписывать значения. Чтобы получить желаемое поведение, запрос должен выглядеть следующим образом:

 [
    {
        "name": "Meeting Name",
        "timer": 100
    },
    {
        "name": "Meeting Name2",
        "timer": 400
    }
]
 

Таким образом, вам также потребуется сменить контроллер. Он должен повторяться по массиву, поэтому код будет выглядеть следующим образом:

 req.body.forEach(item => {
      const response = await MeetingModel.create({
        meetings:
          {
            name: item.name,
            timer: item.timer,
          },
 
      });
});

return res.status(201).json(response);