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

6

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

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}
    }});
});

我的问题是,我订阅文档后在客户端看不到完整版本。我认为这是因为发布简要版本的方法覆盖了完整版本。我不想在不需要时浪费客户端内存来处理长数组,但我需要在需要时使用它们。简要版本在启动时被订阅,当用户访问模板以获得更多洞见时,完整版本被订阅。如何正确管理此情况?
2个回答

3

TL/DR - 跳到第三段。

我猜测这是因为发布函数认为very_long_array字段已经发送给客户端,所以它不会再次发送。你需要稍微调整一下来确认这一点,但在同一字段上发送不同的数据肯定会引起一些问题。

就订阅两个集合而言,你不能这样做,因为唯一的mongo集合名称需要提供给客户端和服务器端的collections对象。实际上,你可能可以通过制造一个伪造的通过DDP远程订阅的客户端订阅,并让它填充一个完全不同的Javascript对象来做一些非常hacky的事情。然而,这不可能是最好的选择。

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

  1. 按照这个答案中详细说明的方法使用低级别出版物API
  2. 使用集合钩子,在very_long_array更改时将数组中的第一个项目填充到另一个字段(例如very_long_array_summary)中,并仅在前一出版物中发布摘要字段。

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

更精确的链接:https://book.discovermeteor.com/chapter/advanced-publications帮助我获得了类似的结果。 - Ole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接