2012-04-15 7 views
0

Frage aktualisiert basierend auf der Antwort. Um zu sehen, unten ursprüngliche Frage blättern ...Wie erstellt man eine komplexe Abfrage mit Resultset aus einer anderen Abfrage in Mongodb?

Also, das die JSON ich nach dem stuColl.find Aufruf am Ende:

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

Jetzt möchte ich das obige verwenden, um einen anderen Fund zu machen, um alle Professor IDs zu erhalten. Aber alles, was ich bekomme, ist ein Null-Ergebnis. Ich denke ich bin sehr nah dran. Was mache ich falsch:

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

Jede Hilfe wird sehr geschätzt!

Ich schreibe eine Anwendung mit Mongo (mit mongo nativen Treiber), node.js und Express.

Ich habe Studenten, Kurse und Professoren Dokumente in Mongo.

Ich möchte eine Liste aller "Professor" Dokumente abrufen, deren Kurse ein Schüler gerade belegt oder in der Vergangenheit gemacht hat.

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

Dies ist, was ich tun beabsichtigen: 1. Ich erste Ausgabe einer Abfrage alle Kurs-IDs für einen Studenten abzurufen. 2. Dann muss ich komponieren und eine weitere Abfrage ausgeben, um die Professor ID für alle diese Kurse zu bekommen. 3. Und dann muss ich schließlich alle "Professor" Dokumente mit den Professor IDs verbunden bekommen.

Schritt 1 ist kein Problem und jetzt habe ich alle Kurs-IDs. Aber ich bin mir nicht sicher, wie man Schritt 2 macht. Schritt 2 und 3 sind ähnlich, sobald ich Schritt 2 herausfinde, wird Schritt 3 einfach sein.

Grundsätzlich möchte ich eine Abfrage in Schritt2 ausgeben, um alle Professor IDs abzurufen. Ich möchte nicht 10 separate Abfragen für 10 Kurs-IDs ausgeben.

hier ist das, was ich habe:

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

Antwort

0

Ich denke, dass statt $ oder sollten Sie die $ in Operator

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

und

verwenden
stuColl.find.... 

sollte sein Ergebnis anArray zurückgeben, das im $ in-Operator verwendet werden soll.

Hallo dort in ein wenig Eile :-) aber bitte prüfen, ob dies ist, was Sie suchen:

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

es geht die Studenten Sammlung Trog und findet die Schüler und dann durch alle seine/ihre Kurse, um schließlich alle Lehrer zu laden. Ist es das?

+0

coffeeyesplease, Danke für die Antwort. Wie Sie aus dem Code sehen können, gibt stuColl.find eine Kursid-Klasse auf oberster Ebene zurück und kann auch ein eingebettetes Array von Kurs-IDs enthalten. Wird es möglich sein, beide Ebenen zu betrachten? Oder wird toArray in der Lage sein, das Multi-Level-Ergebnis auf ein Level-Array von Objekt-IDs zu reduzieren? Wenn nicht, was wäre ein guter Weg, dies zu tun? SU –

+0

Um Ihre Frage zu beantworten, wird kein Mongo es nicht abflachen. Wenn das wirklich das ist, was Sie suchen, dann könnte Ihnen vielleicht die mapReduce-Funktion helfen. Lass es mich wissen, wenn das hilft. – coffeeyesplease

+0

coffeeyjesplease .... das war es. Ich danke dir sehr. –