使用ExpressJs和Mongoose显示每个帖子的所有评论

使用ExpressJs和Mongoose显示每个帖子的所有评论,express,mongoose,pug,Express,Mongoose,Pug,所以我一直在做一个类似instagram的网络应用。 用户可以发表帖子(图片+描述),其他用户可以对图片发表评论 每个帖子都包含一个注释ID数组。 每个评论都包含对其帖子的引用 我搞不懂的是如何查询(查找所有帖子,为每篇帖子获取评论->渲染视图) 下面是模式的样子 //## models/post.js var Post = new Schema({ author : {type: String, required: true}, desc : {type: Stri

所以我一直在做一个类似instagram的网络应用。 用户可以发表帖子(图片+描述),其他用户可以对图片发表评论

每个帖子都包含一个注释ID数组。 每个评论都包含对其帖子的引用

我搞不懂的是如何查询(查找所有帖子,为每篇帖子获取评论->渲染视图)

下面是模式的样子

//## 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
      });
    });
  });
});
我读到猫鼬与一种叫做“填充”的东西一起工作,但这不就是把所有的评论都插入帖子的内容吗?我不希望post文档变得数据密集


有点迷路了。。欢迎提供任何帮助,谢谢。

根据您的模式,您已经在文章中包含了每个评论。作为一种良好的做法,最好不要在模式中包含无限数组,特别是因为您已经在对父文章的评论中有了引用

但是,由于您的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中存储您尚未存储的任何其他内容,您当前正在每篇文章中存储一个CommentID数组,Populate只需将所有这些注释替换到CommentID数组中,以显示您的结果。

很抱歉延迟,我直到周一才能回复。这非常有效,由于您的示例,我终于理解了
ref
populate
的含义。为了清楚起见,以防有人决定在他们自己的项目中使用此示例,我必须更改
.populate('commentsIds')
注释,除此之外,所有操作都可以立即进行。谢谢:)太好了,我在我的帖子中也更正了它,以避免任何混淆。我也有同样的问题,我尝试复制它的代码,但仍然无法让注释出现在用户的数组中。我的结构非常相似,但我不能使它工作,请你看一下,看看我遗漏了什么