【问题标题】:Meteor subscription issue流星订阅问题
【发布时间】:2015-09-23 01:12:37
【问题描述】:

我的 mongodb 上有一组消息。

我创建了两个发布函数:

Meteor.publish("messages", function (self, buddy) {
  check(self, String);
  check(buddy, String);
  return Messages.find({participants: {$all : [self, buddy] }});
});

和,

Meteor.publish("conversations", function(self){
    check(self, String);
    return Messages.find(   
        { participants: { $in : [self] } }, 
        { participants: { $elemMatch: { $ne: self } }, messages: { $slice: -1 }} 
    );
});

我在客户端订阅了这两个:

Meteor.subscribe("conversations", user);
return Messages.find();

和,

Meteor.subscribe("messages", user, buddy);
return Messages.find();

订阅位于不同的模板中。 问题是当我从conversation 订阅返回数据时,数据与来自messages 订阅的数据相同。我在两个订阅中看到相同的结果,即使它们有不同的查询......

我该如何解决这个问题?

【问题讨论】:

    标签: mongodb meteor publish-subscribe


    【解决方案1】:

    这是正常行为,同一个集合包含两个订阅的数据。您还需要在客户端上进行过滤。

    https://www.discovermeteor.com/blog/query-constructors/ 概述了处理此问题的模式。

    基本思想是将查询部分作为服务器和客户端的公共代码,因此它是自我一致的。

    【讨论】:

    • 但是用户将能够看到所有的查询,我们从不信任用户......
    • 用户只得到您发布的内容,您正在向用户发布消息的两个查询。两个集合都允许用户查看。只是它们在同一个集合中。您需要做的就是在客户端也使用相同的查询来分离数据。
    • 不用担心,只要记住,基本的想法是你在客户端上编程,就好像你直接与一个真正的 mongo db 对话一样。所有发布和订阅所做的只是限制最终在客户端上的数据。
    • 对我来说最难理解的是订阅出版物的时候。例如,在模板助手中,我使用 Meteor.subscribe.... 这是否意味着订阅只在模板助手中持续,我无法从中获得结果,对吧?
    • 您有一个名为 Messages 的集合,它在客户端是全局的。当订阅处于活动状态时,该订阅将填充消息。客户端上的任何东西都可以看到来自该订阅的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2012-10-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    相关资源
    最近更新 更多