在 Meteor 中对发布、订阅和数据进行过滤和排序

Filter and sort in publish, subscribe, and data in Meteor

我正在列出属于

用户的所有通知
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().

中进行排序和过滤

三个函数都做几乎相同的事情似乎有点多余。我做得对吗?

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

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

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

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