Meteor Mongo访问Meteor.publish

时间:2016-01-25 03:54:09

标签: mongodb meteor

Meteor.users 集合外,我还有会议室消息集合。

作为会员架构的一部分,有一个 userId (字符串):这引用了启动会议室的 Meteor.user Meteor.users 只能访问他们开始的房间。

作为消息架构的一部分,有一个 userId (字符串)和 roomId (字符串):这些是发布消息的Meteor.user 以及发布消息的会议室

现在,我只希望 Meteor.users 能够订阅已发布到他们有权访问的房间的消息。因此,这包括来自其他用户的房间消息。以下代码仅订阅用户的消息,而不是所有留言到他们的房间。

我将如何做到这一点?

Meteor.publish("messages", function() {
  return Messages.find({userId: this.userId});
});

1 个答案:

答案 0 :(得分:2)

我相信您所说的是您要从会议 当前用户启动时检索所有消息。我认为这应该解决它:

Meteor.publish("messages.allForCurrentUser", function() {
    var currentUser = this.userId;
    var roomsForCurrentUser = Rooms.find({ userId: currentUser }).fetch().map(function(room) { 
        return room._id;
    });  // Gets an array of all Room IDs for the user.
    return Messages.find({ roomId: { $in: roomsForCurrentUser } });
});

我首先抓住当前用户,然后用它来查找用户启动的所有房间。接下来,.map允许我从一个对象数组[{_id:'blah'},...]转换为字符串内部id ['blah',...]的数组。然后我使用MongoDB $ in来获取房间ID数组中所有房间ID的消息。我没有对用户ID做任何事情,因为看起来房间里的消息可能来自任何用户ID。