流星酒吧/子行为
我目前正在实施一个实时搜索功能在我的应用程序,我遇到了一些我很困惑的行为。流星酒吧/子行为
背景是:我的服务器上有两个来自同一个MongoDB数据库的订阅,名为posts
。
第一订阅订阅最新的50个员额,并将数据发送到MiniMongo收集
Posts
。-
第二次订阅订阅用户输入的任何搜索匹配的帖子,并将该数据发送到MiniMongo收集
PostsSearch
,如下所示。// client Posts = new Mongo.Collection('posts'); PostsSearch = new Mongo.Collection('postsSearch'); // server Meteor.publish('postsPub', function(options, search) { return Posts.find(search, options); }); Meteor.publish('postsSearchPub', function(options, search) { var self = this; var subHandle = Posts.find(search, options).observeChanges({ added: function (id, fields) { self.added("postsSearch", id, fields); } }); self.ready(); });
我的问题是,我们知道,从文档:
如果当您创建集合传递一个名字,那么你 声明持久化集合 - 一个存储在服务器 上,并被所有用户看到。客户端代码和服务器代码都可以使用相同的API访问同一个集合的 。
但是,这不是PostsSearch
的情况。当用户开始在客户端上搜索时,功能完美地按预期工作 - 将正确的游标发送到客户端。
但是我没有在我的MongoDB数据库中看到postsSearch
,同样,PostsSearch
没有在我自己的其他客户端上填充。
这是怎么发生的? self.added("postsSearch", id, fields);
似乎是做什么的,它可以将光标发送到客户端,但不能发送到MongoDB数据库。
根据这一doc,self.added("postsSearch", id, fields);
运筹学的一个文件已被添加到收藏postsSeach
客户端。
而且根据Meteor.publish:
或者,发布功能,可直接控制其公布的记录通过调用添加的功能设置(以添加新文档到已发布的记录集),...
所以我猜self.added
做这两项操作:添加一个文件到公布的记录集,并通知该另外的客户端(已订阅到当前出版物)。
现在,如果你看到Meteor.subscribe:
当您订阅一个记录集,它告诉服务器发送记录到客户端。客户端将这些记录存储在本地Minimongo集合中,其名称与发布处理程序的中使用的集合参数的名称相同,并添加,更改并删除回调。 Meteor将对传入记录进行排队,直到您在客户端上使用匹配的集合名称声明Mongo.Collection。
这意味着两件事情:
您有到
subscribe
为了从服务器端数据库接收数据。某些类型的客户端代码必须存在才能创建仅客户端的
postsSearch
集合。 (这是因为你说过,这个集合在服务器端数据库中不存在)。
的第二点可以很容易地实现,例如:
if(Meteor.isClient) {
postsSearch = new Mongo.Collection(null);
}
在上面的例子中,postsSearch
集合将只存在在客户端上,而不是在服务器上。
和关于各1次,被订阅postsSearchPub
将自动为postsSearch
收集的数据发送到客户端(即使说集合不会在服务器端的数据库中。这是因为self.added
的显式调用) 。
东西退房:这一doc,self.ready();
调用onReady
回调认购。看看这个回调中有什么是有用的,也许在那里定义了客户端集合postsSearch
?
从DOC:
this.added(collection, id, fields)
Call inside the publish function.
Informs the subscriber that a document has been added to the record set.
这意味着该行self.added("postsSearch", id, fields);
模拟一个事实,即插入已做了PostsSearch
收集尽管它显然并非如此。
关于没有MongoDB集合,它可能与流星懒惰在第一次插入创建MongoDB集合,但不知道。