2016-09-30 7 views
0

私は "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という名前のもので動作しますが、ポスト内にすべてのコメントを挿入するだけではありません。私はポスト文書がデータ集約的になりたくない...

少し失われてしまった。何か助けが歓迎されて、ありがとう。

答えて

1

あなたのスキーマに基づいて、参照内のすべてのコメントを既に含んでいます。スキルに無制限の配列を含めることをお勧めします。親の投稿に

は、しかし、あなたはすでにあなたのポストのスキーマ内のコメントの配列を持っているので、あなたは、単にデータで各コメントの詳細を含めるために次の操作を行うことができ、あなたのクエリから返された:

router.get('/', function(req, res) { 
    Post.find({}) 
    .populate('commentsIds') 
    .exec(function(err, posts, count){ 
     res.render('index', { 
     user: req.user, 
     page : 'index', 
     title : '??????', 
     posts : posts 
     }); 
    }); 
}); 

移入は」doesnのあなたがまだ保存していないmongodbに何かを追加保存すると、各投稿にcommentIdsの配列が格納されていて、populateはそれらのコメントをすべて取り込み、結果を表示するためにcommentIdsの配列に置き換えます。

+0

遅れて申し訳ありませんが、月曜日まで返信できませんでした。 これは完全に機能しました。私は最終的にあなたの例のおかげで 'ref'と' populate'が意味するものを理解しました。 誰かが自分のプロジェクトでこの例を使用することを決めた場合、私は '.populate( 'commentsIds')'コメント** s **を変更する必要がありました。 それ以外はすべて直ちに動作しました。 ありがとうございました:) –

+0

偉大な、私は混乱を避けるために私の記事でもそれを修正しました。 –

関連する問題