mongoose.findByIdAndUpdate сохранит только первое значение ключа объекта, помещаемого в массив

#javascript #node.js #mongodb #mongoose #nosql

Вопрос:

У меня есть простой объект, в котором хранятся два значения внутри, каждое из которых является значением req.body из данных, отправленных клиентом.

 const pushedVote = {  answer: req.body.answer,   text: req.body.value  }  

Теперь, когда я вызываю findByIdAndUpdate метод, он выглядит так (моей моделью является опрос).

 //insert answer and text   await Poll.findByIdAndUpdate(req.body.id, {  $push: {  responseAnswers: pushedVote,  },  });  

Все это прекрасно работает, но странно то, что в обновленном массиве моей базы данных будет храниться ТОЛЬКО первая пара ключ-значение в объекте. Например, если сохраняемый объект pushedVote имеет ответ «A», а текст «Cat», база данных будет хранить только «A», а не » Cat » вместе с ним. Я что-то здесь упускаю?

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

1. Я предполагаю, что responseAnswers это набор голосов? Если это так, то, возможно, лучше сделать это в 3 этапа, чтобы все было в порядке. 1. const poll = awat Poll.findOne({ _id: mongoose.Types.ObjectId(req.body.id) }); 2. poll.responseAnswers.push(pushedVote); 3. await poll.save();

2. @KingJ это тоже работает, но происходит то же самое. В моей базе данных объект, помещенный в responseAnswers массив, содержит только ключ ответа, а не как ответ, так и текстовый ключ

3. И вы подтвердили, что req.body.value это существует в запросе и доступно в pushedVote объекте, прежде чем обновлять базу данных? Еще одна вещь, которую нужно проверить, — поддерживает ли ваша схема это text свойство.

4. @Kingj вау, я не могу поверить, что забыл добавить это свойство текста в схему. Спасибо за помощь

5. Не беспокойтесь! Рад, что все улажено!

Ответ №1:

Согласно моему комментарию, убедитесь, что text свойство определено в схеме Мангуста, иначе оно не будет сохранено в базе данных.