在forEach循环中获取Mongo数据库值

时间:2018-12-24 06:25:54

标签: node.js mongodb express mongoose foreach

我有两种模式的教师和学生

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,可以获取老师的电子邮件ID,并且必须使用标记和注册给该老师的学生的姓名作为响应。

为此,我正在使用此代码

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模式,以便可以使用学生的数据。

但是我没有得到想要的输出,因为我无法让用户与Student.findOne一起等待。

喜欢

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

我得到一个Query对象。

任何人都可以建议在循环中使用await的任何方式,或者以其他任何方式获取我想要的输出?

如果我在循环中的任何地方使用await,节点将崩溃,因此其他地方回答的在循环中使用async / await的解决方案无法解决我的问题。

4 个答案:

答案 0 :(得分:1)

注意::没有用于Mongoose查询的本机同步API,但是您可以链接查询。

尝试这个;

df1=sqlContext.sql(
    'select id, max(value) over (partition by id) as value from table_view'
)

答案 1 :(得分:0)

代替forEach,您可以使用如下所示的猫鼬查找功能:

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

我想你正在努力让所有老师和他们的学生在一起。

答案 2 :(得分:0)

根据我对您问题的理解,这应该有所帮助

Teacher.find({}, (error, allTeachers) => {
  if (error) {
    // Handle Error
  } else {
    allTeachers.forEach(teacher=> {
      let student = Student.findOne({"email":teacher.email})
    });
  }
})

答案 3 :(得分:0)

您不能在for .. of循环中使用await。您必须改用forEach循环。

一个for .. of循环触发多个异步请求,但此后函数立即返回。它不会等待for (let students of teacher.students) { let student = Student.findOne({"email":students.email}) console.log(student) // to watch the result }); 循环时就解决您的诺言。

将代码更改为:

$routeChangeStart