Получение значений базы данных Mongo в цикле forEach - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть две схемы Учитель и ученик

StudentSchema = new mongoose.Schema({
email:{type:String, index: {unique:true}}
name:{type:String},
marks:[{
subject:{type:String,
marks:{type:Number}
}]
})


TeacherSchema = new mongoose.Schema({
email:{type:String, index: {unique:true}}
name:{type:String},
students:[{
email:{type:String},
registerationDate:{type:Date}
}]
})

У меня есть API, где я получаю идентификатор электронной почты учителя и должен отвечать отметками и именами учеников, зарегистрированных для этого конкретного учителя.

Для этого я использую этот код

var teacher = await Teacher.findOne({"email":req.body.email})

teacher.students.forEach(function(students){
let student = Student.findOne({"email":students.email})
console.log(student)   // to watch the result
})

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

НоЯ не получаю желаемый результат, потому что я не могу ожидать пользователя вместе с Student.findOne.

Вот так

let student = await Student.findOne({"email":students.email})

В результате я получаю объект Query.

Может ли кто-нибудь предложить какой-либо способ использования await в цикле или любой другой способ получения желаемого результата?

Узел завершается сбоем, если я использую await где-нибудь внутри цикла, поэтому в другом месте решения нашли решение использовать async/ ожидание в цикле не решает мою проблему.

Ответы [ 4 ]

0 голосов
/ 24 декабря 2018

Вы не можете использовать await внутри цикла forEach.Вместо этого вы должны использовать цикл for .. of.

A forEach цикл запускает несколько асинхронных запросов, но функция сразу же возвращается после этого.Он не ждет, пока ваше обещание будет выполнено, пока цикл for .. of делает.

Измените код на:

for (let students of teacher.students) {
  let student = Student.findOne({"email":students.email})
  console.log(student)   // to watch the result
});
0 голосов
/ 24 декабря 2018

Исходя из моего понимания вашего вопроса, это должно помочь

Teacher.find({}, (error, allTeachers) => {
  if (error) {
    // Handle Error
  } else {
    allTeachers.forEach(teacher=> {
      let student = Student.findOne({"email":teacher.email})
    });
  }
})
0 голосов
/ 24 декабря 2018

Примечание: Не существует встроенного синхронного API для запросов Mongoose, но вы можете объединять запросы в цепочку.

Попробуйте это;

Teacher.findOne({"email":req.body.email}, (err, teacher)=>{
    if( !err ) {
      let studentEmailIds = [];
      teacher.students.forEach( (students) => {
          studentEmailIds.push(students.email);
      });
      Student.find({'email': {"$in": studentEmailIds } }, (err, students)=>{     
         if(err){
          //error handle
         }else{
          console.log(students)
          //res.json(students);
         }
      });
    }
})
0 голосов
/ 24 декабря 2018

Вместо forEach вы можете использовать функцию поиска Мангуста, как показано ниже:

teacher.find({}, function (err, teachers) {
  // now you can use teachers.forEach here for getting students
  console.log(teachers.students)
});

Полагаю, вы пытаетесь собрать всех Учителей вместе со своими учениками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...