2012-10-05 81 views
1

的不同看法現場計數我想創建一個流星消息應用程序(使用AUTH分支)。它有一個Messages集合,每個文檔都有一系列回覆文檔(「回覆」)。在側邊欄中,我們有不同的消息收集視圖,其中每個視圖都有一個「查詢」字段,該字段作爲Meteor.publish('messages')...方法的參數提供。流星:維持收集

到目前爲止這麼好。如果我點擊一個視圖,頁面的主要部分將顯示與查詢匹配的消息列表。對於每封郵件,如果有任何回覆比當前用戶上次打開郵件時更新,或者她從未打開過郵件,則會以粗體顯示。我通過爲每個包含{user_id,...,read_at:...}記錄的消息維護一個「read_by」字段來實現這一點。這工作也很漂亮。

的問題是,我需要的邊欄中的每個視圖,以顯示與未讀郵件的數量的徽章(按照邏輯在前面的段落)對於每個視圖,而不僅僅是當前選擇的一個。

我該如何解決這個問題?據我所知,這意味着我需要針對Messages集合維護大量的實時查詢。與此同時,客戶端無法訂閱整個Messages集合 - 假設它擁有數百萬個文檔。無論服務器上的數據庫集合中有多少文檔,客戶端都必須保持活躍狀態​​。

我懷疑,這需要不同的架構設計(這是不是一個問題),但我不能完全看到它。

+0

做信息時代了呢? –

+0

不,它更像是一個電子郵件應用程序而不是聊天應用程序,所以計數需要反映數據庫中的狀態。除非手動刪除,否則我們會永久保留每條消息並在數據庫中回覆。 – stiang

+0

這些是共享郵件(在許多用戶之間),我假設「反饋」在閱讀郵件時必須是實時的? –

回答

3

我認爲你有兩個選擇。

的更容易的選擇(這也許不是最有效的)是訂閱的所有不同的查詢你感興趣的是:

_.each(queries, function(query) { 
    Meteor.subscribe('messages', query); 
}) 

而當你需要的信息,使用相同的查詢只選擇你感興趣的那些:

Template.queryView.messages = function() { 
    return Messages.find(queries[Session.get('currentQueryNo')]); 
} 

很明顯,你可以做你需要的計數。

另一種方法是發佈一個特殊的數集,這是手動設置。首先,做的非常相似counts-by-room例如,在文檔的publishing部分的東西,那麼客戶端,這樣做:

var Counts = new Meteor.Collection('counts'); 
_.each(queries, function(query) { 
    Meteor.subscribe('counts-by-query', query); 
}) 

每個訂閱counts-by-query將維持在數集的一個記錄。

希望有幫助!

+0

謝謝,湯姆。一旦我完全理解了按部就班的例子,我就選擇了第二種選擇,而且效果很好。我想我的問題有兩個組件,另一個是如何設計我的模式,以便能夠構建一個查詢,查找給定視圖/用戶組合的所有未讀消息,但這是主要問題,所以我正在標記您的答案作爲正確的一個。再次感謝! – stiang

+0

對。我只是想象你以這樣的方式指定查詢,因爲它只獲得未讀消息的計數。類似於「{read_by:{$ ne:user._id}}」。我必須和mongo一起玩,告訴你是否需要更改模式。也許如果你發佈一個單獨的孟戈問題,你會得到比我可以給你更多專家的答案。 –