了解 Meteor 中服务器与客户端的跳过

Understanding skip on server vs client in Meteor

我只是想检查一下,因为我没有在文档中看到它。也许我只是想念它。

据我所知,如果我订阅了 skip,那么我就不会在客户端上跳过。正确吗?

我正在使用铁路由器。我有这样的代码

Router.route('/docs/:_page', {
  template: 'doclist',
  subscriptions: function() {
    var page = parseInt(this.params._page) - 1;
    var skip = page * 10;
    var limit = 10;
    return Meteor.subscribe("pages", skip, limit);
  },
});

对应的发布是这个

Meteor.publish("pages", function (skip, limit) {
  return Docs.find({}, {skip: skip, limit: limit});
});

但现在在模板助手中我不使用 skip AFAICT,因为 MiniMongo

中只有 limit 结果
  Template.doclist.helpers({
    docs: function () {
      var route = Router.current();
      var pageId = parseInt(route.params._page) || 1;
      var page = pageId - 1;
      var skip = page * 10;
      return Docs.find({}, {
         // skip: skip   
         limit: limit,
      });
    },
  });

似乎有效。如果我在 skip 行中发表评论,那么我在第 2 页上没有结果。

这是正确的还是我做错了什么?

您是对的 - 在这种情况下,客户端不需要 skip。假设您在数据库中有 100 个文档,您跳过前 20 个文档,限制为 10 个。那么客户端上将只存在 10 个文档。每当您 find 在客户端(在您的模板中)时,您正在查询本地数据库(在本例中为 10 个文档),因此跳过是不合适的。

我要提醒您,所有这些都是基于您 只有一个 订阅 Docs 的概念。要扩展上面的示例,如果您在客户端的同一集合中有另外 15 个文档来自另一个订阅,那么您可能需要进行一些额外的过滤以仅显示您感兴趣的文档。