根据另一个Meteor集合的属性过滤一个Meteor集合

时间:2016-02-17 10:25:35

标签: javascript html meteor

我正在尝试建立一个类似于Reddit的网站。这是指向so far的链接,此处是该网站的code。因此,如果用户创建了一个帐户并点击其中一个网站链接,它就会将用户发送到有关该网站的网页,并在其下方添加评论表单。当用户发表评论并点击“保存”时,他们的评论将显示在页面底部。

我遇到的问题是发布的评论会显示在网站的所有详细页面上。例如,如果用户点击Google链接然后在页面上发表评论,然后返回并单击Coursera,则用户所做的评论也会显示在Coursera页面上。

目前我有这段代码将注释呈现到comments_section模板中:

Template.comments_section.helpers({
  comments:function(){
    return Comments.find({});
  }
});

有没有办法可以将网站ID传递给find方法,以便过滤掉在其他网页上发表的评论?

2 个答案:

答案 0 :(得分:1)

您应该将每条评论链接到该网站:

创建字段websiteId

Comments.insert({
  comment:comment,
  postedOn: new Date(),
  websiteId: Router.current().params._id
});

在路线上

this.render('comments_section', {
  to: "section",
  data: function(){
    return Comments.find({websiteId:this.params._id});
  }
});

那应该使用该网站ID查询评论

让我知道

修改

而是在路由器中查询,尝试从模板查询:

Template.comments_section.helpers({
  comments:function(){
    return Comments.find({websiteId:this.params._id});
  }
});

答案 1 :(得分:0)

两个选项,真的。第一个是@yudap上面说的,但另一个是反规范化并将所有注释直接添加到帖子文档中。例如,您对帖子的初始插入内容如下所示:

Posts.insert({
  title: "this dog is a cat",
  link: "http://nickelodeon.wikia.com/wiki/CatDog",
  comments: []
});

然后每当有人试图插入评论时,你都可以这样做:

Posts.update(this.params._id, {
  $push: {
    $each: [{
      content: "You're totally right, that dog is a cat",
      userId: Meteor.userId(),
      timestamp: new Date()
    }],
    $sort: { timestamp: 1 }
  }
});

然后,如果您愿意,可以一次性获取帖子和所有相关评论。