Meteor - 两次订阅相同的集合 - 保持结果分开?

jon*_*omo 6 publish-subscribe meteor

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

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}
    }});
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

ric*_*ilv 3

TL/DR - 跳到第三段。

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

就订阅两个集合而言,您不应该能够执行此操作,因为需要向客户端和服务器端集合对象提供唯一的 mongo 集合名称。在实践中,您可能可以通过 DDP 将一个客户端订阅设置为虚假的远程订阅,并让它填充一个完全独立的 Javascript 对象,从而做一些非常黑客的事情。然而,这并不是最好的选择。

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

  1. 使用本答案中详细介绍的低级出版物 API
  2. 每当更改时,使用集合挂钩very_long_array_summary数组中的第一项填充到另一个字段(例如 )very_long_array,并仅发布前一个出版物中的摘要字段。