路由器级别订阅中的流星计数

Meteor Counts in Router Level Subscription

我有一个订阅 posts 出版物的列表 limit

发表

Meteor.publish('posts', function(options) {
  check(options, {
    sort: Object,
    limit: Number
  });

  var posts = Posts.find({}, options);

  return posts;
});

在列表中,我在每个

下都有项目

list.html

{{#each posts}}
  {{> postItem}}
{{/each}}

在每个postItem中,我想统计它的评论数。

我相信上面的代码是

Template.postItem.helpers({
   commentsCount: function () {
    return Comments.find({postId: this._id }).count();
   }
});

问题在于我必须在 posts 出版物中发布所有评论,这确实效率低下。

我想制作一个出版物,我可以在模板级别为每个 postItems 订阅它,只是 return 结果 Counts 我试过 tmeasday:publish-counts 但是我没有弄清楚如何让它在我的情况下工作,或者即使它会在这种情况下使用。

选项 1:在 Posts 集合本身中跟踪评论数。

每次插入新评论时,更新计数器:

Posts.update(
 { _id: String },
 { $inc: { commentsCount: 1 } }
)

这样您就不需要为了获取计数而订阅 Comments,这将涉及到服务器的多次往返。

选项 2:使用 Meteor.methodsMeteor.call 到 return 每个帖子的评论数。将多次往返服务器。

选项 3:使用 aggregation to $group 并计算服务器上的评论数并将其映射回客户端上的帖子。

选项 4Reactive joins

对于性能和反应性,我强烈推荐选项 #1。