在Meteor中对发布,订阅和数据进行筛选和排序

时间:2015-06-29 11:07:23

标签: javascript node.js meteor iron-router

我列出了属于

用户的所有通知
this.route('notifications', {
  path: '/notifications',
  template: 'notificationList',
  waitOn: function() {
    return Meteor.subscribe('notifications');
  },
  data: function() {
    return Notifications.find(
      {userId: Meteor.userId()},
      {sort: {createdAt: -1}}
    );
  },
  fastRender: true
});

我用

发布文档
Meteor.publish("notifications", function () {
    return Notifications.find(
        {userId: this.userId},
        {sort: {createdAt: -1}}
    );
});

我很困惑在哪里做什么。我是否必须在Meteor.publish()data: ...中过滤用户ID?我是否必须对两种功能进行排序?我已经看到也可以在Meteor.subscribe()中进行排序和过滤。

在所有三个功能中几乎完全相同似乎有点多余。我这样做了吗?

1 个答案:

答案 0 :(得分:3)

调用Meteor.publish时,通常需要进行排序,以便在应用限制时发送正确的文档。例如,如果您只要求10个项目,那么您需要先对它们进行排序,以确保您拥有正确的 10个项目,而不是10个随机结果。

客户的排序顺序与服务器的发布请求没有任何关系,并且不保证它们是相同的。例如,考虑将多个发布请求发布到客户端上的相同集合的情况,每个集合都有不同的排序顺序。将这些结果以有用的方式预先排序是不可能的。

因此,您通常还需要在访问客户端上的集合时请求对项目进行排序。排序不必与服务器上的排序相同(尽管通常是这样)。

对于Meteor.subscribe,您在那里传递的参数取决于您的发布功能的参数,因此您可以让您的客户端将排序顺序传递给发布功能。当您需要使用相同的发布函数根据排序顺序返回不同的结果时,这非常有用。此外,如果订阅和提供数据上下文的代码在同一个路由控制器中,那么您可以使用单个变量保存排序条件,从而减少代码重复和错误发生的可能性。