私は "instagramのような" Webアプリケーションを作っています。 ユーザーは投稿(画像+説明)を作成でき、他のユーザーは画像にコメントできます。ExpressJsとMongooseで投稿ごとにすべてのコメントを表示する
各投稿にはコメントIDの配列が含まれています。 各コメントには投稿の参照が含まれています。
私が知ることができないのは、どのように問い合わせるかです(すべての投稿を検索し、それぞれの投稿に対してコメント - >表示を表示します)。ここで
には誤りがありませんのように「作品」が、それはちょうど彼らのすべてのposts..notの下にあるすべてのコメントを出力しているスキーマが
//## models/post.js
var Post = new Schema({
author : {type: String, required: true},
desc : {type: String},
imageUrl : {type: String},
commentsIds: [{type:Schema.ObjectId, ref:'Comment'}],
likes : {type: Number, default: 0},
created_at : {type:Date, default: Date.now}
});
//## models/comment.js
var Comment = new Schema({
username : {type: String, required: true},
content : {type: String, required: true},
post : {type:Schema.ObjectId, ref:'Post'},
created_at: Date
});
ようになり、私のルータは、現時点では、このようにあるものです私が望むようなそれぞれのポスト。
// routes.js
router.get('/', function(req, res) {
Post.find(function(err, posts, count){
Comment.find({post: {$in: posts}}, function (err, comments, count){
res.render('index', {
user: req.user,
page : 'index',
title : 'トップページ',
posts : posts,
comments : comments
});
});
});
});
Iveは、populateという名前のもので動作しますが、ポスト内にすべてのコメントを挿入するだけではありません。私はポスト文書がデータ集約的になりたくない...
少し失われてしまった。何か助けが歓迎されて、ありがとう。
遅れて申し訳ありませんが、月曜日まで返信できませんでした。 これは完全に機能しました。私は最終的にあなたの例のおかげで 'ref'と' populate'が意味するものを理解しました。 誰かが自分のプロジェクトでこの例を使用することを決めた場合、私は '.populate( 'commentsIds')'コメント** s **を変更する必要がありました。 それ以外はすべて直ちに動作しました。 ありがとうございました:) –
偉大な、私は混乱を避けるために私の記事でもそれを修正しました。 –