2012-04-15 10 views
0

答えに基づいて質問が更新されました。Mongodbの別のクエリの結果セットを使用して複雑なクエリを作成するにはどうすればよいですか?

[{ "current_course_id": "4f7fa4c37c06191111000005"、 "past_courses":[{そう...ダウン

を元の質問のスクロールを表示するには、これは私がstuColl.findコールの後で終わるJSONであります"course_id": "4f7fa4c37c06191111000003"}、{"course_id": "4f7fa4c37c06191111000002"}}}

ここで、上記のようにすべての教授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); 
       }); 
      }); 
     }); 

何か助けてくれてありがとうございます!


私はmongo(mongoネイティブドライバを使用)、node.js、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); 
    }); 
    }); 
} 

SU

答えて

0

私はその代わりに、$たり、オペレータ

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

に$を使用するべきだと思います
stuColl.find.... 

は$ in演算子で使用するtoArrayの結果を返さなければなりません。 :-)ラッシュのビットで

そここんにちはこれはあなたが探しているものであるかどうかを確認してください:

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); 
      }); 
     });   
    } 
}); 

それは学生の収集トラフ行くと見つけ学生をして、彼のすべてを通じてだ/彼女のコースは最終的にすべての教師を読み込む。それですか?

+0

coffeeyesplease、 応答に感謝します。 コードからわかるように、stuColl.findはトップレベルのcourseidを返しますし、コースIDの埋め込み配列も含むことができます。 $で両方のレベルを見ることができますか?またはtoArrayはオブジェクトレベルの1レベル配列に複数レベルの結果をフラット化できますか?もしそうでないなら、それを行うには良い方法がありますか? SU –

+0

あなたの質問に答えるために、mongoはそれを平坦化しません。それが本当にあなたが探しているものなら、おそらくmapReduce関数が役立つかもしれません。これが助けられたら教えてください。 – coffeeyesplease

+0

coffeeyesplease ....それだった。どうもありがとうございます。 –