Oto uproszczona wersja tego, czego chcesz.
Podstawowe dane do założenia, najpierw „studenci”:
{
"_id" : ObjectId("53aa90c83ad07196636e175f"),
"name" : "Bill",
"rollNo" : 1,
"class" : 12
},
{
"_id" : ObjectId("53aa90e93ad07196636e1761"),
"name" : "Ted",
"rollNo" : 2,
"class" : 12
}
A potem kolekcja „drużyny”:
{
"_id" : ObjectId("53aa91b63ad07196636e1762"),
"name" : "team1",
"lead" : "me",
"students" : [
{
"block" : 1,
"status" : "Y",
"student" : ObjectId("53aa90c83ad07196636e175f")
},
{
"block" : 2,
"status" : "N",
"student" : ObjectId("53aa90e93ad07196636e1761")
}
]
}
Tak to się robi:
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 ) );
});
});
I daje wyniki:
{
"_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
}
}
]
}
Naprawdę nie potrzebujesz modułu "async", ale ja po prostu mam zwyczaj. Nie blokuje się, dlatego uważam to za lepsze.
Jak widać, inicjujesz .populate()
call nie robi nic, ponieważ oczekuje "klucza" z _id
wartość w kolekcji obcej z tablicy wejściowej, której to "ściśle mówiąc" nie jest takie, jak "klucz" jest na "uczniu" zawierającym "klucz obcy".
Naprawdę omówiłem to w ostatniej odpowiedzi tutaj , może niezupełnie specyficzne dla Twojej sytuacji. Wygląda na to, że twoje wyszukiwanie nie przyniosło poprawnej „tej samej odpowiedzi” (choć nie dokładnie), z której możesz czerpać odniesienie.