在我的流星项目中,用户可以发布事件,他们必须选择(通过自动完成)在哪个城市进行.我有一份法国城市的完整清单,它永远不会更新.
我想根据自动完成的输入使用集合和发布 - 订阅,因为我不希望客户端下载完整的数据库(5MB).对于性能,有没有办法告诉流星这个集合是"静态的"?或者它没有区别?
有谁能提出不同的方法?
当你"想告诉服务器集合是静态的"时,我发现了两个可能的优化:
(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作为方法调用返回,尽管这不具有压缩的好处.