// 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.
答案 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();