有没有办法告诉meteor一个集合是静态的(永远不会改变)?

jad*_*dus 6 meteor

在我的流星项目中,用户可以发布事件,他们必须选择(通过自动完成)在哪个城市进行.我有一份法国城市的完整清单,它永远不会更新.

我想根据自动完成的输入使用集合和发布 - 订阅,因为我不希望客户端下载完整的数据库(5MB).对于性能,有没有办法告诉流星这个集合是"静态的"?或者它没有区别?

有谁能提出不同的方法?

And*_*Mao 7

当你"想告诉服务器集合是静态的"时,我发现了两个可能的优化:

  1. 不要使用实时查询来观察数据库,因为数据永远不会更改
  2. 不要将此查询的结果存储在合并框中,因为它不需要跟踪并与其他数据进行比较(节省内存和CPU)

(1)通过构建自己的发布游标,您可以轻松完成.但是,如果任何客户端正在观察相同的查询,我相信Meteor将(至少在将来)优化它,因此它仍然只是一个任意数量的客户端的实时查询.至于(2),我不知道有任何简单的方法可以做到这一点,因为它可能会破坏多个出版物和订阅的数据合并.

要避免使用实时查询,可以手动将数据添加到发布函数而不是返回游标,这会导致.observe()调用函数以将数据连接到订阅.这是一个简单的例子:

Meteor.publish(function() {
    var sub = this;
    var args = {}; // what you're find()ing

    Foo.find(args).forEach(function(document) {
        sub.added("client_collection_name", document._id, document);
    });

    sub.ready();
});
Run Code Online (Sandbox Code Playgroud)

这将导致数据被添加到client_collection_name客户端,这可能与引用的集合具有相同的名称Foo,或者不同的东西.请注意,您可以使用出版物执行许多其他操作(另请参阅上面的链接.)

更新:要解决(2)中的问题,根据集合的大小可能会出现问题,因此必须完全绕过Meteor.有一种方法,请参见/sf/answers/1528487411/.另一种方法是将集合fetch()ed作为方法调用返回,尽管这不具有压缩的好处.