2017-10-01 9 views
0

私がしようとしていることが可能かどうかわかりません。ネストされた参照によってリンクされたプロパティ値を表示する方法

ユーザースキーマ(モデル)を参照するコメントスキーマ(モデル)を参照する記事ドキュメントからデータを取得することによって、ユーザースキーマ(モデル)の 'name'プロパティの値を表示します。

'article'は 'user.name'値を保持する 'user'を参照する 'comment'を参照しています。

私のコントローラコードがIDデータにより、物品を取得し、「作者」を投入すると「コメント」フィールドにするには、次のようになります。

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

記事のマイ・スキーマ(モデル)は、このようなコメント 'プロパティが含まれています。

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

私のコメントスキーマ(モデル)は、このような '著者' プロパティが含まれています

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

ユーザースキーマ(モデル)には、自分のビュー(EJS)に表示する値を保持する 'name'プロパティがあります。

私はそれを表示する方法を見つけることができませんでした。なぜなら、私は別のクエリなしでそれを行うことができないからかもしれません。

私は 'article.comments'配列をループし、<%= comment.text %>というコメントテキストを正常に表示しますが、コメントスキーマで参照される 'user'スキーマ(モデル)から 'name'プロパティを表示する方法を見つけることができません(モデル)。

私のエラーについての洞察はありがたいです。

答えて

0

可能です。あなたがしようとしているのは、深い人口です。あなたのビューで

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

を行う

は単純に、各コメントのために、あなたは、詳細については

<%- comment.author.name %> 

ような何かを、このlinkをチェックアウトします。

+0

ありがとうMikey。 "comment.author"で参照されているユーザスキーマのプロパティではなく、 'comment.text'と' comment._id'を表示できます。 – JimB814

0

は、あなたは私のための答えを生成しなかった深い人口に深い人口の

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

Thanks Ayush。同じエラーが発生しています: "未定義のプロパティ 'name'を読み取ることができません。パスの値はスキーマ内のプロパティかモデル名ですか?モデル名は、記事、コメント、ユーザーです。プロパティは 'article.comments'、 'comment.author'、および 'user.name'です。 – JimB814

+0

@ Jimv814あなたは移入するフィールド名を入れなければなりません。 –

0

追加の調査を行う必要があります。ここに私がしたことがあります。

私は私のコメントのスキーマを変更し、「ID」を作成し、このような「ユーザ名」&「名前」プロパティ/フィールド:

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

おそらくDRY違反が、それは私が私がする必要があるデータを取得することができます表示。コメントや著者のフィールドを移入

マイクエリ:

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

は、私は深い人口が最良の答えを保持していると思われるが、時間は時々に移動するために私たちを強制します。うまくいけば、これは同様の状況にある誰かを助けるかもしれない。彼らの助けを借りてMikeyとAyushに感謝します。

関連する問題