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

时间:2013-07-17 11:49:57

标签: meteor

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

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

有人可以建议采用不同的方法吗?

3 个答案:

答案 0 :(得分:7)

当你“想告诉服务器集合是静态的”时,我知道两种可能的优化:

  1. 不要使用实时查询来观察数据库,因为数据永远不会改变
  2. 不要将此查询的结果存储在merge box中,因为它不需要跟踪并与其他数据进行比较(节省内存和CPU)
  3. (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);
相关问题