次の3つのモデルを想定します。
var CarSchema = new Schema({
name: {type: String},
partIds: [{type: Schema.Types.ObjectId, ref: 'Part'}],
});
var PartSchema = new Schema({
name: {type: String},
otherIds: [{type: Schema.Types.ObjectId, ref: 'Other'}],
});
var OtherSchema = new Schema({
name: {type: String}
});
Carsを照会すると、パーツを追加できます。
Car.find().populate('partIds').exec(function(err, cars) {
// list of cars with partIds populated
});
すべての車のネストされたパーツオブジェクトにotherIdsを設定する方法があります。
Car.find().populate('partIds').exec(function(err, cars) {
// list of cars with partIds populated
// Try an populate nested
Part.populate(cars, {path: 'partIds.otherIds'}, function(err, cars) {
// This does not populate all the otherIds within each part for each car
});
});
私はおそらく各車を反復処理して移入することができます:
Car.find().populate('partIds').exec(function(err, cars) {
// list of cars with partIds populated
// Iterate all cars
cars.forEach(function(car) {
Part.populate(car, {path: 'partIds.otherIds'}, function(err, cars) {
// This does not populate all the otherIds within each part for each car
});
});
});
問題は、非同期のようなlibを使用してそれぞれに対してpopulate呼び出しを行い、すべてが完了してから戻るまで待たなければならないことです。
すべての車をループせずに実行できますか?
更新:Mongoose 4で追加されたよりコンパクトなバージョンについては Trinh Hoang Nhuの答え をご覧ください。
Car
.find()
.populate({
path: 'partIds',
model: 'Part',
populate: {
path: 'otherIds',
model: 'Other'
}
})
マングース3以下:
Car
.find()
.populate('partIds')
.exec(function(err, docs) {
if(err) return callback(err);
Car.populate(docs, {
path: 'partIds.otherIds',
model: 'Other'
},
function(err, cars) {
if(err) return callback(err);
console.log(cars); // This object should now be populated accordingly.
});
});
このようなネストされた母集団の場合、移入したいスキーマをmongooseに伝える必要があります。
Mongoose 4はこれをサポートします
Car
.find()
.populate({
path: 'partIds',
model: 'Part',
populate: {
path: 'otherIds',
model: 'Other'
}
})
mongoose deepPopulateプラグイン を使用します
car.find().deepPopulate('partIds.otherIds').exec();
より良いはずです
Car
.find()
.populate({
path: 'partIds.othersId'
})