流星酒吧/子行为

问题描述:

我目前正在实施一个实时搜索功能在我的应用程序,我遇到了一些我很困惑的行为。流星酒吧/子行为

背景是:我的服务器上有两个来自同一个MongoDB数据库的订阅,名为posts

  1. 第一订阅订阅最新的50个员额,并将数据发送到MiniMongo收集Posts

  2. 第二次订阅订阅用户输入的任何搜索匹配的帖子,并将该数据发送到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数据库。

根据这一docself.added("postsSearch", id, fields);运筹学的一个文件已被添加到收藏postsSeach客户端。

而且根据Meteor.publish

或者,发布功能,可直接控制其公布的记录通过调用添加的功能设置(以添加新文档到已发布的记录集),...

所以我猜self.added做这两项操作:添加一个文件到公布的记录集,并通知该另外的客户端(已订阅到当前出版物)。


现在,如果你看到Meteor.subscribe

当您订阅一个记录集,它告诉服务器发送记录到客户端。客户端将这些记录存储在本地Minimongo集合中,其名称与发布处理程序的中使用的集合参数的名称相同,并添加,更改并删除回调。 Meteor将对传入记录进行排队,直到您在客户端上使用匹配的集合名称声明Mongo.Collection。

这意味着两件事情:

  1. subscribe为了从服务器端数据库接收数据。

  2. 某些类型的客户端代码必须存在才能创建仅客户端的postsSearch集合。 (这是因为你说过,这个集合在服务器端数据库中不存在)。

的第二点可以很容易地实现,例如:

if(Meteor.isClient) { 
    postsSearch = new Mongo.Collection(null); 
} 

在上面的例子中,postsSearch集合将只存在在客户端上,而不是在服务器上。

和关于各1次,被订阅postsSearchPub将自动为postsSearch收集的数据发送到客户端(即使说集合不会在服务器端的数据库中。这是因为self.added的显式调用) 。


东西退房:这一docself.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集合,但不知道。