订阅Meteor.Users Collection

o2k*_*vin 10 mongodb meteor

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

// in client.js
Meteor.subscribe("directory");
Run Code Online (Sandbox Code Playgroud)

我现在想从客户端查询目录列表,就像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. 
Run Code Online (Sandbox Code Playgroud)

Tom*_*cik 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();
  });

});
Run Code Online (Sandbox Code Playgroud)

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

directories = new Meteor.Collection('thisNameMatters');
Run Code Online (Sandbox Code Playgroud)

并订阅相应的数据集:

Meteor.subscribe('thisNameDoesNotMatter');
Run Code Online (Sandbox Code Playgroud)

这应该现在有效.如果您认为这种解释不够明确,请告诉我.

编辑

这里,这些self.added/changed/removed方法或多或少地作为事件调度程序.简单地说,他们给每个打电话的客户发出指示

Meteor.subscribe('thisNameDoesNotMatter');
Run Code Online (Sandbox Code Playgroud)

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

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


Tob*_*old 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");
Run Code Online (Sandbox Code Playgroud)

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

var usersArray = Meteor.users.find().fetch();
Run Code Online (Sandbox Code Playgroud)

要么

var oneUser = Meteor.users.findOne();
Run Code Online (Sandbox Code Playgroud)