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

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

    不要使用实时查询来观察数据库,因为数据永远不会改变 不要将此查询的结果存储在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://***.com/a/21835534/586086 了解一种方法。另一种方法是仅将集合 fetch()ed 作为方法调用返回,尽管这没有压缩的好处。

【讨论】:

这应该是可以接受的答案,直到可以解决#2。谢谢安德鲁 @WesJohnson 请参阅 ***.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);
);

【讨论】:

以上是关于有没有办法告诉流星集合是静态的(永远不会改变)?的主要内容,如果未能解决你的问题,请参考以下文章

在C ++类中初始化静态变量?

ListBox SelectedItem永远不会设置

有没有办法让 CSS calc() 永远不会是负值?

如何防止流星重新连接到服务器

换专业,学编程,永远不会晚

流星一次或“静态”发布,无需收集跟踪