【问题标题】:Meteor - subscribe to same collection twice - keep results separate?Meteor - 两次订阅同一个集合 - 将结果分开?
【发布时间】:2014-11-26 20:03:55
【问题描述】:

我有一种情况,我需要订阅同一个集合两次。我的服务器端代码中的两个发布方法如下:

Meteor.publish("selected_full_mycollection", function (important_id_list) {
    check(important_id_list, Match.Any);  // should do better check
    // this will return the full doc, including a very long array it contains
    return MyCollection.find({
        important_id: {$in: important_id_list}
    });
});
Meteor.publish("all_brief_mycollection", function() {
    // this will return all documents, but only the id and first item in the array
    return MyCollection.find({}, {fields: {
        important_id: 1,
        very_long_array: {$slice: 1}
    }});
});

我的问题是我在订阅后没有在客户端看到完整的文档。我认为这是因为它们被仅发布简短版本的方法所覆盖。

我不想在不需要长数组时用长数组堵塞我的客户端内存,但我确实希望它们在我需要时可用。

简要版在启动时订阅。当用户访问深入了解更多洞察的模板时,订阅完整版。

我该如何妥善处理这种情况?

【问题讨论】:

    标签: meteor publish-subscribe


    【解决方案1】:

    TL/DR - 跳到第三段。

    我推测这是因为发布函数认为very_long_array字段已经发送给客户端,所以它不再发送它。您必须花点时间来确认这一点,但是在同一字段上发送不同的数据势必会导致一些问题。

    就订阅两个集合而言,您不应该这样做,因为需要将唯一的 mongo 集合名称提供给客户端和服务器端集合对象。在实践中,您可能可以通过将一个客户端订阅设置为虚假的remote subscription via DDP 并让它填充一个完全独立的 Javascript 对象来做一些真正的黑客行为。但是,这并不是最好的选择。

    这种情况可以通过在同一字段以外的地方发布您的摘要来解决。不幸的是,当从发布函数返回游标时,您不能使用转换(这将是最简单的方法),但您有两个选择:

    1. 使用low-level publications API,详见this answer
    2. 每当very_long_array 更改时,使用collection hooks 用数组中的第一项填充另一个字段(如very_long_array_summary),并仅发布前一个出版物中的汇总字段。

    【讨论】:

      【解决方案2】:

      第三种选择可能是将长版本发布到仅在客户端上为此目的而存在的不同集合。您可能需要查看 Discover Meteor 的“高级 Pub/Sub”章节(最后一个子章节)。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多