5

我有一个名为 Profiles 的服务器端 mongo 集合。

如果用户:adminId,我需要发布和订阅整个配置文件集合。

这样管理员就可以编辑、更新等...每个配置文件集合项。

但我希望用户能够看到他们的个人资料记录。

所以我尝试了这个...

客户端

MyProfile = new Meteor.Collection("myprofile");
Meteor.subscribe('profiles');
Meteor.subscribe('myprofile');

通用 - 客户端和服务器端

Profiles = new Meteor.Collection("profiles");

服务器端 - 配置文件的发布和订阅工作正常。

// this returns all profiles for this User
// if they belong to an ACL Group that has acl_group_fetch rights
Meteor.publish("profiles", function() { 
    var user_groups = Groups.find({users: this.userId()});
    var user_groups_selector = [];
    user_groups.forEach(function (group) {
       user_groups_selector.push(group._id);
    });
    return Profiles.find( {
       acl_group_fetch: {
          $in: user_groups_selector
        } 
    });
});

这是问题似乎开始的地方。Profiles.find 正在返回集合项,因为我可以将它们输出到控制台服务器端。但由于某种原因,发布和订阅不起作用。客户什么也没收到。

//  return just the users profile as myprofile
Meteor.publish("myprofile", function() {
  return  Profiles.find({user: this.userId()});
});

任何想法我做错了什么。我希望能够发布用户 A 可以插入、获取、更新、删除但用户 B(C、D 和 E)只能看到他们的记录的记录集合。

4

3 回答 3

1

我不完全确定您如何检查错误,但我认为您可能遇到了我遇到的问题。当您使用 Profiles 集合发布数据时,即使 pub/sub 调用使用“myprofile”名称,数据始终在您为其返回游标的集合中可用......在这种情况下,您的数据在“myprofile”发布中发布将显示在客户端的“profiles”集合中。发布调用不会在客户端上创建“myprofile”集合。因此,如果您尝试在“myprofile”集合上查找(),您将看不到任何数据。(Meteor/MongoDB 不会抱怨该集合不存在,因为它们总是会在您引用它时懒惰地创建它。)

于 2012-08-01T17:09:18.983 回答
1

I think your issue is more on the MongoDB side than with meteor. Given your case I'd do two collections (Group and Profile).

Each document in the Group collection would feature an array containing DBRefs to documents in the Profile collection (actually users so I would think about renaming the Profile collection to User as imo that's more intuitive).

Same for the Profile collection and its documents; each document in the profile collection (representing a user) would have an array field containing DBrefs to groups the user belongs to (documents inside the Group collection).

于 2012-08-01T05:37:19.403 回答
0

我认为这里的问题是您只需要一个集合:Profiles.

所以如果你只是删除有问题的行

MyProfile = new Meteor.Collection("myprofile");

一切都应该正常工作(您将在集合中拥有两个数据Profiles集)。

于 2012-08-01T02:56:23.460 回答