24

假设以下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
     });
  });
});

问题是我必须使用像 async 这样的库来为每个库进行填充调用,然后等到所有操作都完成然后返回。

可以不循环所有汽车吗?

4

4 回答 4

42

更新:请参阅Trinh Hoang Nhu 的答案,了解在 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.
    });
  });

对于像这样的嵌套人口,您必须告诉 mongoose 您要从中填充的 Schema。

于 2015-01-27T21:33:34.007 回答
29

Mongoose 4 支持这个

Car
.find()
.populate({
  path: 'partIds',
  model: 'Part',
  populate: {
    path: 'otherIds',
    model: 'Other'
  }
})
于 2015-12-23T22:32:16.220 回答
4

使用猫鼬 deepPopulate 插件

car.find().deepPopulate('partIds.otherIds').exec();
于 2015-07-30T09:38:01.300 回答
0

它应该更好

Car
.find()
.populate({
    path: 'partIds.othersId'
})
于 2019-07-31T04:40:43.043 回答