0

我正在使用 Mongo(使用 Mongo 本机驱动程序)、Node 和 Express 编写应用程序。

我在 mongo 中有学生、课程和教授的文件。

我想检索学生当前正在学习或过去学习过的所有“教授”文件的列表。

Students: {courseid, ....}
Course: {professors, ....}
Professors: {....}

这就是我打算做的:

  1. 我首先发出一个查询来检索学生的所有课程 ID。
  2. 然后我必须编写并发出另一个查询来获取所有这些课程的教授 ID。
  3. 最后,我必须获取与教授 ID 相关的所有“教授”文件。

第 1 步没问题,现在我有了所有课程 ID。但我不确定如何执行第 2 步。第二步和第三步类似,一旦我弄清楚第二步,第三步就很容易了。

基本上我想在第 2 步中发出一个查询来检索所有教授 ID。我不想针对 10 个课程 ID 发出 10 个单独的查询。

这是我所拥有的:

function getProfsByStudent(req, res, next)
{
  db.collection('students', function(err, stuColl)
  {
    stuId = new ObjectID.createFromHexString(req.params.stuId);
    stuColl.find({_id : userId}, { 'current_course_id' : 1 , 'past_courses.course_id' : 1 , _id : 0 })
    {
      db.collection('courses', function(err, courseColl)
      {
        courseColl.find({$or : []}) // THIS IS WHERE I AM STUCK
      });
      res.send(posts);
    });
  });
}

更新

根据答案更新问题。

所以,这是我在stuColl.find通话后得到的 JSON:

[{"current_course_id":"4f7fa4c37c06191111000005","past_courses":[{"course_id":"4f7fa4c37c06191111000003"},{"course_id":"4f7fa4c37c06191111000002"}]}]

现在我想用上面的方法做另一个 find 来获取所有的教授 ID。但我得到的只是一个空结果。我认为我非常接近。我究竟做错了什么?

stuColl.find({_id : userId}, { 'current_course_id' : 1 , 'past_courses.course_id' : 1 , _id : 0 }).toArray(function(err, courseIdsArray)
        {
            db.collection('courses', function(err, courseColl)
            {
                courseColl.find({$or : [ {_id : 'courseIdsArray.current_courses_id' }, {_id : {$in : courseIdsArray.past_courses}} ]}, {'professor_ids' : 1}).toArray(function(err, professorIdsArray)
                {
                  res.send(professorIdsArray);
                });
            });
        });
4

1 回答 1

0

我认为$or应该使用$in运算符而不是您

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in

和:

stuColl.find....

应该返回其结果toArray以在$in运算符中使用。

更新

我想这就是你要找的:

db.collection("Students").find({_id : "8397c60d-bd7c-4f94-a0f9-f9db2f14e8ea"}, {CurrentCourses:1, PastCourses : 1, _id : 0}).toArray(function(err, allCourses){
    if(err){
        //error handling
    }
    else{           
        var courses = allCourses[0].CurrentCourses.concat(allCourses[0].PastCourses);           
        db.collection("Courses").find({ _id : { $in: courses}}, {"Professors" : 1, _id : 0}).toArray(function(err, professors){ 
            if(err){
                //error handling
            }
            var allProfs = [];
            for(var i = 0; i < professors.length; i++){
                allProfs = allProfs.concat(professors[i].Professors);
            }
            db.collection("Professors").find({ _id : { $in: allProfs }}).toArray(function(err, results){
                console.log(results);
            });
        });         
    }
});

它通过学生集合找到学生,然后通过他/她的所有课程最终加载所有教师。

于 2012-04-15T22:36:33.563 回答