假设以下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} });
当我查询汽车时,我可以填充零件:
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 }); }); });
问题是我必须使用一个像async这样的库来对每个对象进行填充调用,然后等到所有操作完成后再返回。
可以在不循环所有汽车的情况下做?
更新: 请参阅以获取在Mongoose 4中添加的更紧凑的版本。摘要如下:
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. }); });
对于这样的嵌套种群,您必须告诉猫鼬要从中填充的架构。