【问题标题】:Is there a way to tell meteor a collection is static (will never change)?有没有办法告诉流星集合是静态的(永远不会改变)?
【发布时间】:2013-07-15 23:03:40
【问题描述】:

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

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

有人可以提出不同的方法吗?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    当您“想告诉服务器集合是静态的”时,我知道有两个潜在的优化:

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

    (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()ed 作为方法调用返回,尽管这没有压缩的好处。

    【讨论】:

    • 这应该是可以接受的答案,直到可以解决#2。谢谢安德鲁
    • @WesJohnson 请参阅 stackoverflow.com/a/21835534/586086 了解如何解决 #2。我也会在某个时候更新这个答案。
    【解决方案2】:

    来自 Meteor 文档: “对集合的任何更改都会更改游标中的文档,都会触发重新计算。要禁用此行为,请将 {reactive: false} 作为查找选项传递。”

    我认为这个简单的选项是最好的答案

    【讨论】:

      【解决方案3】:

      您无需发布整个收藏集。
      1.仅在用户输入前 3 个字母后才显示自动完成选项 - 这将显着缩小您的搜索范围。
      2.提供不超过 5-10 个城市作为选项 - 这将使您的记录集非常小 - 因此无需向每个用户推送 5mb 的数据。
      您的出版物应如下所示:

      Meteor.publish('pub-name', function(userInput){
         var firstLetters = new RegExp('^' + userInput);
         return Cities.find({name:firstLetters},{limit:10,sort:{name:1}});
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-06
        • 2022-01-02
        • 2019-12-01
        • 2011-06-25
        • 2020-03-19
        • 2021-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多