#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");
});```