在Meteor中如何以不同的名称发布一个服务器端mongo集合?

时间:2012-08-01 02:27:42

标签: meteor

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

如果用户:adminId。

,我需要发布和订阅整个Profiles集合

管理员可以通过这种方式编辑,更新等...每个个人资料收集项目。

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

所以我试过了......

客户端

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

COMMON - 客户端和服务器端

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 个答案:

答案 0 :(得分:3)

在此主题中查看已接受的答案 - 可能是您正在寻找的内容:

Publishing/subscribing multiple subsets of the same server collection

答案 1 :(得分:1)

我认为你的问题更多是关于MongoDB方面而不是流星。鉴于你的情况,我会做两个集合(组和简介)。

Group集合中的每个文档都包含一个包含 DBRefs 的数组到Profile集合中的文档(实际上是用户,所以我会考虑将Profile集合重命名为User,因为它更直观)。 / p>

Profile集合及其文档相同;配置文件集合中的每个文档(代表用户)都有一个数组字段,其中包含用户所属组的DBref(Group集合中的文档)。

答案 2 :(得分:1)

我不完全确定你是如何检查错误的,但我认为你可能遇到了我遇到的问题。当您使用“个人档案”集合发布数据时,即使发布/子调用使用“myprofile”名称,数据也总是在您返回光标的集合中可用...在这种情况下,数据是在'myprofile'出版物中发布的内容将显示在客户端的“个人资料”集合中。发布调用不会在客户端上创建“myprofile”集合。因此,如果您尝试在'myprofile'集合中查找(),您将看不到任何数据。 (Meteor / MongoDB不会抱怨该集合不存在,因为它们在您引用时总是懒得创建它。)

答案 3 :(得分:0)

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

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

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

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