0

Mongo(Mongoネイティブドライバーを使用)、Node、Expressを使用してアプリケーションを作成しています。

私はmongoに学生、コース、教授のドキュメントを持っています。

学生が現在受講している、または過去に受講したコースを持つすべての「教授」ドキュメントのリストを取得したいと思います。

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

これは私がやろうとしていることです:

  1. 最初にクエリを発行して、学生のすべてのコースIDを取得します。
  2. 次に、これらすべてのコースの教授IDを取得するために、別のクエリを作成して発行する必要があります。
  3. そして最後に、教授IDに関連付けられているすべての「教授」ドキュメントを取得する必要があります。

ステップ1は問題ではなく、すべてのコースIDがあります。しかし、step2の実行方法がわかりません。ステップ2と3は似ていますが、ステップ2を理解すれば、ステップ3は簡単になります。

基本的に、step2で1つのクエリを発行して、すべての教授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"}]}]

次に、上記を使用して、すべての教授IDを取得するための別の検索を実行します。しかし、私が得るのはnullの結果だけです。私はとても近いと思います。私は何が間違っているのですか?

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 に答える