除 Meteor.users 集合外,我还有会议室和消息集合。
作为会员架构的一部分,有一个 userId (字符串):这引用了启动会议室的 Meteor.user 。 Meteor.users 只能访问他们开始的房间。
作为消息架构的一部分,有一个 userId (字符串)和 roomId (字符串):这些是发布消息的Meteor.user 以及发布消息的会议室。
现在,我只希望 Meteor.users 能够订阅已发布到他们有权访问的房间的消息。因此,这包括来自其他用户的房间消息。以下代码仅订阅用户的消息,而不是所有留言到他们的房间。
我将如何做到这一点?
Meteor.publish("messages", function() {
return Messages.find({userId: this.userId});
});
答案 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。