Ini adalah versi sederhana dari apa yang Anda inginkan.
Data dasar yang harus disiapkan, pertama "siswa":
{
"_id" : ObjectId("53aa90c83ad07196636e175f"),
"name" : "Bill",
"rollNo" : 1,
"class" : 12
},
{
"_id" : ObjectId("53aa90e93ad07196636e1761"),
"name" : "Ted",
"rollNo" : 2,
"class" : 12
}
Dan kemudian koleksi "tim":
{
"_id" : ObjectId("53aa91b63ad07196636e1762"),
"name" : "team1",
"lead" : "me",
"students" : [
{
"block" : 1,
"status" : "Y",
"student" : ObjectId("53aa90c83ad07196636e175f")
},
{
"block" : 2,
"status" : "N",
"student" : ObjectId("53aa90e93ad07196636e1761")
}
]
}
Begini caranya:
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 ) );
});
});
Dan itu memberi Anda hasil:
{
"_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
}
}
]
}
Anda benar-benar tidak memerlukan modul "async", tetapi saya hanya "dalam kebiasaan" seperti itu. Itu tidak "memblokir" jadi saya menganggapnya lebih baik.
Jadi seperti yang Anda lihat, inisial .populate()
panggilan tidak melakukan apa pun seperti yang diharapkan untuk "mengunci" dari _id
nilai dalam koleksi asing dari input array yang "tepatnya" ini tidak demikian karena "kunci" ada di "siswa" yang berisi "kunci asing".
Saya benar-benar membahas ini dalam jawaban terbaru di sini , mungkin tidak terlalu spesifik untuk situasi Anda. Tampaknya penelusuran Anda tidak menemukan "jawaban yang sama" yang benar (meskipun tidak persis ) untuk Anda jadikan referensi.