2017-10-01 2 views
0

Vous ne savez pas si ce que j'essaie de faire est possible. Je souhaite afficher la valeur de la propriété 'name' dans mon schéma d'utilisateur (modèle) en récupérant des données d'un document d'article qui fait référence au schéma de commentaire (modèle) qui fait référence au schéma utilisateur (modèle). 'Article' fait référence à 'comment' qui référence 'utilisateur' qui contient la valeur 'user.name' que je veux récupérer.Comment afficher la valeur de la propriété liée par référence imbriquée

Mon code de contrôleur pour récupérer l'article par des données d'identité et remplir les champs « auteur » et «commentaires de ressemble à ceci:

Article.findById(req.params.id) 
     .populate('author') 
     .populate('comments') 
     .exec(function(err, article){ 
     if(err){ 
      return req.flash('error', 'Unable to display article.'); 
     } else { 
      res.render('articles/show', { 
       article: article 
      }); 
     } 
    }); 

Mon schéma de l'article (modèle) comprend une propriété « commentaires » comme ceci:

... 
    comments: [ 
     { 
     type: Schema.Types.ObjectId, 
     ref: "Comment" 
     } 
    ], 
    ... 

Mon schéma de commentaire (modèle) comprend une propriété 'auteur' comme ceci:

... 
    text: String, 
    author: 
    { 
     type: Schema.Types.ObjectId, 
     ref: "User" 
    }, 
    ... 

Le schéma utilisateur (modèle) a la propriété 'nom' qui contient la valeur que je veux afficher dans ma vue (EJS). Donc, jusqu'à présent, j'ai été incapable de trouver un moyen de l'afficher, peut-être parce que je ne peux pas le faire sans une autre requête. Je parcourt le tableau 'article.comments' et affiche le texte du commentaire avec <%= comment.text %> mais je n'arrive pas à trouver un moyen d'afficher la propriété 'name' du schéma 'utilisateur' (model) référencé dans le schéma de commentaire (modèle).

J'apprécierais n'importe quel aperçu quant à mon erreur (s).

Répondre

0

C'est possible. Ce que vous essayez de faire, c'est une population profonde.

Il suffit de faire

Article.findById(req.params.id).populate({ 
    path: 'comments', 
    populate: { 
     path: 'author' 
    } 
}).exec(function(err, article){ 
    if (err) 
     return req.flash('error', 'Unable to display article.'); 
    res.render('articles/show', { article: article }); 
}); 

À votre avis, pour chaque commentaire, vous feriez quelque chose comme

<%- comment.author.name %> 

Pour plus d'informations, consultez cette link.

+0

Merci Mikey. Implémenté et obtenant l'erreur: "Impossible de lire la propriété 'name' de undefined" Je peux afficher 'comment.text' et' comment._id' mais pas la propriété du schéma utilisateur référencé dans 'comment.author' – JimB814

0

Vous devez faire la population profonde

Article.findById(req.params.id).populate({ path: 'article', populate:{ path: 'comments', populate: { path: 'user' } } }).exec(function(err, article){ if (err) return req.flash('error', 'Unable to display article.'); res.render('articles/show', { article: article }); });

+0

Merci Ayush. Je reçois la même erreur: "Impossible de lire la propriété 'name' de undefined". La valeur de path est-elle la propriété du schéma ou du nom du modèle? Les noms de modèles sont article, commentaire et utilisateur. Les propriétés sont 'article.comments', 'comment.author' et 'user.name'. – JimB814

+0

@ Jimv814 vous devez mettre le nom du champ que vous voulez remplir. –

0

D'autres recherches sur la population profonde n'a pas produit une réponse pour moi. Voici ce que j'ai fait.

Je modifié mon schéma Commentaire et créé « id », « nom d'utilisateur » & propriétés « nom »/domaines comme celui-ci:

.... 
var Schema = mongoose.Schema;  
var commentSchema = new Schema({ 
    text: String, 
    author: { 
     id: 
     { 
     type: Schema.Types.ObjectId, 
     ref: "User"  
     }, 
     username: String, 
     name: String  
    }, 
    .... 

Peut-être une violation DRY, mais il me permet d'obtenir les données que je dois afficher.

Ma requête qui renseigne les commentaires et les champs de l'auteur:

Article.findById(req.params.id) 
    .populate('comments') 
    .populate('author') 
    .exec(function(err, article){ 
     if(err){ 
     console.log(err); 
     return req.flash('error', 'Unable to display article.'); 
     } else { 
     res.render('articles/show', { 
      article: article 
     }); 
     } 
    }); 

Je soupçonne que la population profonde détient la meilleure réponse, mais le temps nous oblige parfois à passer. Espérons que cela pourrait aider quelqu'un dans une situation similaire. Merci à Mikey et Ayush pour leur aide.