2017-10-17 5 views
1

Après avoir passé une journée à essayer de faire avancer les choses, je pense qu'il est temps de demander de l'aide.Mongoose profond peupler les résultats dans [Objet] au 2e niveau

Je souhaite remplir 2 niveaux d'un document.

J'ai essayé avec populate() mais il semble fonctionner seulement pour le premier niveau, pas pour remplir en profondeur! Je lis beaucoup à SO et je sais que ça devrait marcher mais je pense qu'il me manque quelque chose de vraiment stupide ...

Veuillez me faire savoir où je fais des erreurs.

Voici le code pertinent.

Schemas

var compositionSchema = new Schema({ 
    name: { 
     type: String, 
     required: true 
    }, 
    contributions: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'Contribution' 
    }] 
}); 
mongoose.model('Composition', compositionSchema); 

var contributionSchema = new Schema({ 
    name: { 
     type: String, 
     required: true 
    }, 
    media: { 
     type: Schema.Types.ObjectId, 
     ref: 'Media' 
    } 
}); 
mongoose.model('Contribution', contributionSchema); 

var mediaSchema = new Schema({ 
    name: { 
     type: String, 
     required: true 
    } 
}); 
mongoose.model('Media', mediaSchema); 

documents réels enregistrés dans MongoDB

compositions:

{ 
    "_id" : ObjectId("59e5db4595fe650a71fb0e07"), 
    "name" : "Test Pop 7", 
    "contributions" : [ 
     ObjectId("59e5db4595fe650a71fb0e05") 
    ] 
} 

Contributions:

{ 
    "_id" : ObjectId("59e5db4595fe650a71fb0e05"), 
    "name" : "Honda", 
    "media" : ObjectId("59e4ac5dacacd709eac2c856") 
} 

médias:

{ 
    "_id" : ObjectId("59e4ac5dacacd709eac2c856"), 
    "name" : "Logo_big.png", 
    "width" : 662, 
    "height" : 540 
} 

Mes essais (? = Code erroné)

dans le nœud JS, quand je fais cela (selon la documentation):

Composition.findOne({ name: "Test Pop 7" }) 
     .populate({ 
      path: 'contributions', 
      model: 'Contribution', 
      populate: { 
       path: 'media', 
       model: 'Media', 
      } 
     }) 
     .exec((error, doc) => { 
      if (error) { console.log(error); } 
      else { 
       console.log(doc); 
      } 
     }); 

imprime ceci, sans renseigner le champ média:

{ _id: 59e5db4595fe650a71fb0e07, 
    name: 'Test Pop 7', 
    contributions: 
    [ { _id: 59e5db4595fe650a71fb0e05, 
     name: 'Honda', 
     media: [Object] } ] 
} 

Répondre

3

Cela fonctionne, en gardant à l'esprit le mot-clé dans votre question: imprime. Imprimé, avec console.log(), il vous montre simplement le type (vérifié avec typeof) du document inclus dans un tableau pour un certain niveau d'imbrication (2e). Si vous faites:

console.log(doc.contributions[0].media[0]) 

vous verrez votre document rempli media.