在我的流星项目中,用户可以发布活动,他们必须选择(通过自动填充)在哪个城市进行。我有一份法国城市的完整清单,它永远不会更新。
我想根据自动完成的输入使用集合和发布 - 订阅,因为我不希望客户端下载完整的数据库(5MB)。对于性能,有没有办法告诉流星这个集合是“静态的”?或者没有区别?
有人可以建议采用不同的方法吗?
答案 0 :(得分:7)
当你“想告诉服务器集合是静态的”时,我知道两种可能的优化:
(1)是您可以通过构建自己的发布游标而轻松完成的事情。但是,如果任何客户端正在观察相同的查询,我相信Meteor将(至少在未来)优化它,因此它仍然只是一个任意数量的客户端的实时查询。对于(2),我不知道有任何直接的方法可以做到这一点,因为它可能会使multiple publications and subscriptions上的数据合并混乱。
为了避免使用实时查询,您可以手动将数据添加到发布函数而不是返回游标,这会导致调用.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();
});
这将导致数据添加到客户端的client_collection_name
,其名称可能与Foo
引用的集合相同,或者不同。请注意,您可以执行many other things with publications(另请参阅上面的链接。)
更新:要解决(2)中的问题,根据集合的大小,可能会出现问题,因此必须完全绕过Meteor。有关一种方法,请参阅https://stackoverflow.com/a/21835534/586086。另一种方法是将集合fetch()
作为方法调用返回,尽管这没有压缩的好处。
答案 1 :(得分:3)
来自Meteor doc: “对集合中的任何更改都会更改游标中的文档将触发重新计算。要禁用此行为,请将{reactive:false}作为查找选项。”
我认为这个简单的选项是最好的答案
答案 2 :(得分:0)
您不需要发布整个馆藏。
1.仅在用户输入前3个字母后才显示自动填充选项 - 这将显着缩小搜索范围
2.提供不超过5-10个城市作为选项 - 这将使您的记录集非常小 - 因此无需向每个用户推送5mb的数据。
您的出版物应如下所示:
double value;
value = fmax (fmin (value, 1.0), 0.0);