Hier is een vereenvoudigde versie van wat je wilt.
Basisgegevens om in te stellen, eerst de "studenten":
{
"_id" : ObjectId("53aa90c83ad07196636e175f"),
"name" : "Bill",
"rollNo" : 1,
"class" : 12
},
{
"_id" : ObjectId("53aa90e93ad07196636e1761"),
"name" : "Ted",
"rollNo" : 2,
"class" : 12
}
En dan de collectie "teams":
{
"_id" : ObjectId("53aa91b63ad07196636e1762"),
"name" : "team1",
"lead" : "me",
"students" : [
{
"block" : 1,
"status" : "Y",
"student" : ObjectId("53aa90c83ad07196636e175f")
},
{
"block" : 2,
"status" : "N",
"student" : ObjectId("53aa90e93ad07196636e1761")
}
]
}
Zo doe je het:
var async = require('async'),
mongoose = require('mongoose');
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/team');
var teamSchema = new Schema({
name: String,
lead: String,
students: [{
block: Number,
status: String,
student: {
type: Schema.ObjectId, ref: 'Student'
}
}]
});
var studentSchema = new Schema({
name: String,
rollNo: Number,
class: Number
});
var Team = mongoose.model( "Team", teamSchema );
var Student = mongoose.model( "Student", studentSchema );
Team.findById("53aa91b63ad07196636e1762")
.select('students')
.exec(function(err, team) {
console.log( team );
async.forEach(team.students, function(student,callback) {
Student.populate(
student,
{ "path": "student" },
function(err,output) {
if (err) throw err;
callback();
}
);
},function(err) {
console.log( JSON.stringify( team, undefined, 4 ) );
});
});
En het geeft je de resultaten:
{
"_id": "53aa91b63ad07196636e1762",
"students": [
{
"block": 1,
"status": "Y",
"student": {
"_id": "53aa90c83ad07196636e175f",
"name": "Bill",
"rollNo": 1,
"class": 12
}
},
{
"block": 2,
"status": "N",
"student": {
"_id": "53aa90e93ad07196636e1761",
"name": "Ted",
"rollNo": 2,
"class": 12
}
}
]
}
Je hebt de "async"-module echt niet nodig, maar ik ben gewoon "in de gewoonte" als het ware. Het "blokkeert" niet, dus daarom beschouw ik het als beter.
Dus zoals je kunt zien, begin je .populate()
oproep doet niets zoals het verwacht een _id
te "sleutelen" waarde in de buitenlandse collectie van een array-invoer die "strikt genomen" niet zo is omdat de "sleutel" op "student" staat die de "buitenlandse sleutel" bevat.
Ik heb dit echt behandeld in een recent antwoord hier , misschien niet helemaal specifiek voor uw situatie. Het lijkt erop dat uw zoekopdracht niet het juiste "hetzelfde antwoord" heeft opgeleverd (hoewel niet precies) waaruit u kunt putten.