所以我一直在做一个类似于Instagram的"" Web应用程序。 用户可以发布帖子(图片+描述),其他用户可以对图片进行评论。
每个帖子都包含一系列评论ID。 每条评论都包含对其帖子的引用。
我无法弄清楚如何查询(查找所有帖子,每个帖子获取评论 - >渲染视图)。
以下是Schema的样子
//## 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
});
});
});
});
我已经读过mongoose正在使用一个名为populate的东西,但这不仅仅是在帖子中插入所有评论吗?我不希望帖子文档成为数据密集型......
有点失落..欢迎任何帮助,谢谢。
答案 0 :(得分:1)
根据您的架构,您已经在帖子中包含了引用的所有评论...最好不要在架构中包含无限数组作为一种良好实践,特别是因为您已经在评论中引用了父母的帖子。
但是,由于Post模式中已有一系列注释,因此您只需执行以下操作即可在查询返回的数据中包含每条注释的完整详细信息:
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
});
});
});
Populate不会在你尚未存储的mongodb中存储任何其他内容,你当前在每个帖子中存储了一个commentIds数组,populate只需要获取所有这些注释并将它们替换为commentIds数组以显示你的结果。