web-dev-qa-db-fra.com

Mangouste peupler le tableau imbriqué

En supposant les 3 modèles suivants:

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}
});

Lorsque je recherche des voitures, je peux remplir les pièces:

Car.find().populate('partIds').exec(function(err, cars) {
  // list of cars with partIds populated
});

Existe-t-il un moyen dans mangouste pour peupler les autres objets dans les objets parties imbriqués pour toutes les voitures.

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
  });
});

Je peux probablement parcourir chaque voiture et essayer de remplir:

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
     });
  });
});

Le problème est que je dois utiliser une bibliothèque comme async pour effectuer l'appel de remplissage pour chacun et attendre que tout soit terminé, puis revenir.

Possible de faire sans boucler sur toutes les voitures?

22
lostintranslation

Mise à jour: Veuillez voir réponse de Trinh Hoang Nh pour une version plus compacte qui a été ajoutée dans Mongoose 4. Résumée ci-dessous:

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

Mangouste 3 et moins:

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.
    });
  });

Pour les populations imbriquées comme celle-ci, vous devez indiquer à mangouste le schéma à partir duquel vous souhaitez peupler.

36
Sven

Mongoose 4 supporte cela

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

Utiliser plugin mongoose deepPopulate

car.find().deepPopulate('partIds.otherIds').exec();
4
Riyas TK

Ça devrait être mieux avec

Car
.find()
.populate({
    path: 'partIds.othersId'
})
0
Tuấn Anh Đào