web-dev-qa-db-ja.com

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を使用してそれぞれに対してpopulate呼び出しを行い、すべてが完了してから戻るまで待たなければならないことです。

すべての車をループせずに実行できますか?

17

更新: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に伝える必要があります。

32
Sven

Mongoose 4はこれをサポートします

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

mongoose deepPopulateプラグイン を使用します

car.find().deepPopulate('partIds.otherIds').exec();
4
riyas tk

より良いはずです

Car
.find()
.populate({
    path: 'partIds.othersId'
})
0