我有一种情况需要两次订阅同一个集合。我的服务器端代码中的两个发布方法如下:
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}
}});
});
我的问题是,在订阅它们之后,我没有在客户端看到完整的文档。我认为这是因为它们被仅发布简短版本的方法所覆盖。
当我不需要长阵列时,我不想阻塞我的客户端内存,但我确实希望它们在我需要它时可用。
简要版本在启动时订阅。当用户访问深入了解的模板时,订阅完整版本。
我如何妥善管理这种情况?
答案 0 :(得分:3)
TL / DR - 跳到第三段。
我推测这是因为发布功能认为very_long_array
字段已经发送到客户端,所以它不会再发送它。你不得不捏捏一下来确认这一点,但在同一个领域发送不同的数据肯定会引起一些问题。
在订阅两个集合方面,您不应该这样做,因为需要向客户端和服务器端集合对象提供唯一的mongo集合名称。在实践中,您可能能够通过使一个客户端订阅伪造remote subscription via DDP并使其填充完全独立的Javascript对象来做一些非常hacky的事情。但是,这不是最好的选择。
通过将您的摘要发布到同一字段以外的其他内容,可以解决此问题。遗憾的是,从发布函数返回游标时,您无法使用转换(这是最简单的方法),但您有两种选择:
very_long_array_summary
更改时,使用collection hooks使用数组中的第一项填充另一个字段(如very_long_array
),并仅发布以前的出版物中的摘要字段。答案 1 :(得分:1)
第三个选项可能是将长版本发布到仅在客户端上为此目的而存在的其他集合。您可能需要查看Discover Meteor的“高级Pub / Sub”章节(最后一章)。