MongoDB / javascript использует массив в массиве

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Я делаю назначение, и мне нужен массив в моей базе данных, существующий следующим образом:

 Questions [category : "Math", Question[questionID: 1, question:"What is 1 1", answer:"2"], category: "Math", Question[questionID: 2, question:"What is 2 2", answer:"4"]]
  

и так далее. Теперь в Robo3T я могу создать такую базу данных
введите описание изображения здесь

Теперь, когда я использую mongoose, он вообще не создает никаких заполнителей в базе данных. Он останавливается на вопросах array op, в которых ничего нет. Как вставить запись в этот массив, который выглядит как

введите описание изображения здесь

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

Проблема, с которой я сталкиваюсь, заключается в том, что внешняя функция randomQuestions пуста, поэтому я не могу начать пытаться вставить ее в базу данных. И внутри функции я не могу использовать await в сочетании с Quiz.updateOne . Я думаю, что моя ошибка заключается в этом. Я попытался вставить случайное значение в массив, который работает нормально. Вывод функции (то, что найдено в randomQuestions , выглядит следующим образом

введите описание изображения здесь

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

1. Можете ли вы показать, как вы разработали свою модель?

2. @wak786 Схема выглядит следующим образом. i.imgur.com/JIp0hQJ.png Я попытался удалить предопределенные QuestionID, question и answer и просто получить пустой массив и вставить его туда, но это тоже не помогло.

3. Как вы отправляете новый вопрос в массив? Схема выглядит так, как будто она должна работать, поэтому должно быть что-то не так с тем, как вы нажимаете на массив с помощью Mongoose. Пример кода был бы полезен.

4. @saulmaldonado я добавил изображение самого фрагмента кода

Ответ №1:

В вашем коде вы создали запрос на обновление, но не выполнили его.

Изменение:

 Quiz.updateOne({ gamepin: req.params.gamepin },{ $push: { questions: randomQuestions } });
  

Для:

 Quiz.updateOne({ gamepin: req.params.gamepin },{ $push: { questions: randomQuestions } }).exec();
  

Устраняет вашу проблему.

Запросы не вызываются неявно, чтобы позволить вам манипулировать и строить запрос, связывая разные операторы. На самом деле вы сделали это в своем коде для другого запроса.

 Questions.findOne()
  .skip(random)
  .exec(function(err, result){
  ...
});
  

Вы также можете использовать await , чтобы пропустить необходимость делать это и немедленно выполнить запрос. Это рекомендуемый способ выполнения запросов.

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

1. Большое спасибо. Я пытался выполнить метод await, но это выдало мне ошибку (не могу найти, какую именно). Код, который у меня был ранее, взят из другого поста о переполнении стека. Я не знал, как работает .exec. Я начал этот урок в школе 6 недель назад, начиная с базового javascript. Следовательно, я все еще учусь. Большое вам спасибо! Ваш ответ мне в некотором роде помог 🙂

Ответ №2:

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

 expressApp.get("/quizzer/:gamepin/:category", async (req, res) => {
  let randomQuestions = [];
  let total = await Questions.countDocuments({ category: req.params.category });
  for (let i = 0; i < 1; i  ) {
    let random = Math.floor(Math.random() * total);
    question = await Questions.findOne().skip(random);
    if (randomQuestions[question]) {
      i--;
    } else {
      randomQuestions.push(question);
    }
  }
  await Quiz.updateOne(
    { gamepin: req.params.gamepin },
    { $push: { questions: randomQuestions } }
  );
  res.send("done");
});```