2016-02-27 72 views
2

我目前正在實施一個實時搜索功能在我的應用程序,我遇到了一些我很困惑的行爲。流星酒吧/子行爲

背景是:我的服務器上有兩個來自同一個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數據庫。

回答

1

根據這一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

0

從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集合,但不知道。