订阅Meteor.Users Collection

时间:2014-08-08 08:03:40

标签: mongodb meteor

// in server.js
Meteor.publish("directory", function () {
return Meteor.users.find({}, {fields: {emails: 1, profile: 1}});
});

// in client.js
Meteor.subscribe("directory");

我现在想从浏览器的控制台获取客户端中的directory.findOne()查询目录列表。 //测试目的

执行directory=Meteor.subscribe('directory') / directory=Meteor.Collection('directory')并执行directory.findOne()并不起作用,但当我执行directory=new Meteor.Collection('directory')时,它可以正常运行并返回undefined,我打赌它会创建一个mongo集合在我不喜欢的服务器上,因为USER集合已经存在,它指向一个新的集合,而不是USER集合。

注意:我不想搞砸Meteor.users集合如何处理它的功能...我只是想用一个不同的句柄从它中检索一些特定的数据,这个句柄只返回指定的字段而不是覆盖它的默认功能......

例如:

Meteor.users.findOne() // will return the currentLoggedIn users data
directory.findOne() // will return different fields taken from Meteor.users collection. 

2 个答案:

答案 0 :(得分:12)

如果您希望此设置有效,则需要执行以下操作:

Meteor.publish('thisNameDoesNotMatter', function () {
  var self = this;
  var handle = Meteor.users.find({}, {
    fields: {emails: 1, profile: 1}
  }).observeChanges({
    added: function (id, fields) {
      self.added('thisNameMatters', id, fields);
    },
    changed: function (id, fields) {
      self.changed('thisNameMatters', id, fields);
    },
    removed: function (id) {
      self.removed('thisNameMatters', id);
    }
  });

  self.ready();

  self.onStop(function () {
    handle.stop();
  });

});

否则在客户端,您需要定义仅客户端集合:

directories = new Meteor.Collection('thisNameMatters');

并订阅相应的数据集:

Meteor.subscribe('thisNameDoesNotMatter');

现在应该可以了。如果您认为这种解释不够明确,请告诉我。

修改

这里,self.added/changed/removed方法或多或少地作为事件调度程序。简而言之,他们会给每个致电

的客户发出指示
Meteor.subscribe('thisNameDoesNotMatter');

假设此集合存在,应该在名为thisNameMatters的客户端集合上应用的更新。名称 - 作为第一个参数传递 - 几乎可以任意选择,但如果客户端没有相应的集合,则所有更新都将被忽略。请注意,此集合可以仅限客户端,因此它不一定必须与" real"在您的数据库中收集。

publish方法返回光标,它只是上述代码的快捷方式,唯一的区别是使用了实际集合的名称而不是theNameMatters。这个机制实际上允许你创建尽可能多的"镜像"您希望的数据集。在某些情况下,这可能非常有用。唯一的问题是这些"集合"将是只读的(这完全有意义BTW)因为如果他们没有在服务器上定义相应的`insert / update / remove'方法不存在。

答案 1 :(得分:7)

该集合名为Meteor.users,无需在服务器和客户端都声明新的。

您的发布/订阅代码是正确的:

// in server.js
Meteor.publish("directory", function () {
return Meteor.users.find({}, {fields: {emails: 1, profile: 1}});
});

// in client.js
Meteor.subscribe("directory");

要访问服务器已发布的用户集合中的文档,您需要执行以下操作:

var usersArray = Meteor.users.find().fetch();

var oneUser = Meteor.users.findOne();