【问题标题】:Subscribing to Meteor.Users Collection订阅 Meteor.Users 集合
【发布时间】:2014-10-01 15:34:51
【问题描述】:
// 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') 时它起作用并返回未定义,我敢打赌它会在服务器上创建一个我不喜欢的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. 

【问题讨论】:

  • 这应该是directory = new Meteor.Collection('directory')。如果它是未定义的,那么你可能在其他地方分配了这个变量。
  • 我想使用“目录”作为句柄从 Meteor.users 集合中获取数据,如果我这样做 new Meteor.Collection("directory") 不会创建一个 mongo 集合到服务器端并将“目录”句柄附加到“目录集合”?
  • 尝试将新的 Meteor.Collection('directory') 放到客户端专用文件夹中(在服务器和客户端都读取之前),但仍然无效。
  • 啊...现在我知道你在那里做了什么:)

标签: mongodb meteor


【解决方案1】:

如果您希望此设置正常工作,您需要执行以下操作:

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 的客户端集合的更新,假设该集合存在。名称 - 作为第一个参数传递 - 几乎可以任意选择,但如果客户端没有相应的集合,则所有更新都将被忽略。请注意,此集合可以是仅客户端的,因此它不一定必须对应于数据库中的“真实”集合。

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

【讨论】:

  • 我明天试试 :)
  • 有效!你能告诉我这里到底发生了什么吗:D
  • 看到了,但使用“this”和 self.foo('thisNameDoesMatter') 有点混乱。
  • @o2kevin 我添加了更多解释。希望这会有用。
【解决方案2】:

该集合称为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();

【讨论】:

  • 好吧,你是说如果我修改了 Meteor 发布用户集合的方式,即使给它一个像“目录”这样的句柄也会覆盖客户端上的默认 Meteor.user 调用?
  • 是的。不过你的解释有点不准确。客户端上没有覆盖调用,并且“目录”不是订阅句柄。 “目录”是记录集的名称,它简单地定义了“Meteor.users”集合的哪些文档(和字段)被发送到客户端。客户端将这些文档存储在与调用“Meteor.publish”(即“Meteor.users”)中使用的集合同名的本地集合中。
  • 这可能会覆盖默认用户本地集合
猜你喜欢
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
相关资源
最近更新 更多