Mongoose заполняет вложенный массив

Предполагая следующие 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, например async, чтобы сделать запрос заполнения для каждого и ждать, пока все не будут выполнены, а затем вернутся.

Можно обойтись без обхода всех автомобилей?

Ответ 1

Обновление: Пожалуйста, см. ответ Trinh Hoang Nhu для более компактной версии, которая была добавлена ​​в Mongoose 4. Подведено ниже:

Car
  .find()
  .populate({
    path: 'partIds',
    model: 'Part',
    populate: {
      path: 'otherIds',
      model: 'Other'
    }
  })

Mongoose 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, из которой вы хотите заполнить.

Ответ 2

Mongoose 4 поддерживает этот

Car
.find()
.populate({
  path: 'partIds',
  model: 'Part',
  populate: {
    path: 'otherIds',
    model: 'Other'
  }
})