2014-11-13 193 views
0

我一直在尋找一些流星代碼,我看到了這一點:流星模板優化

Template.notifications.helpers({ 
    notifications: function() { 
    return Notifications.find({userId: Meteor.userId(), read: false}); 
    }, 
    notificationCount: function(){ 
    return Notifications.find({userId: Meteor.userId(), read: false}).count(); 
    } 
}); 

所以我想知道,這是優化? 我的意思是,mongo數據庫會執行兩個查詢嗎?服務器部分?客戶端部分? (mini mongo then)

是否可以在第二個函數中使用先前的結果?我試過

notificationCount = function(){ 
    this.notifications.length; 
.... 

但它不起作用,但也許流星記得以前的結果並使用它? 我肯定會在我的模板中返回一個something.find()來獲得遊標,然後返回其他變量,例如:count,或者用字段或其他東西過濾它,所以我這個問題的結果。

任何專家解釋我?非常感謝流星社區:)!

+0

從蒙戈文檔:[COUNT](http://docs.mongodb.org/manual/reference/method/cursor.count/#cursor.count)不執行查詢,而是對查詢返回的結果進行計數。 – solarc

回答

1

您不在服務器上執行2個查詢,最終成爲最關鍵的地方。當您訂閱數據時,數據將進入名爲MiniMongo的瀏覽器中的本地數據庫。您可以在客戶端上運行儘可能多的查詢,數據集(通常和希望如此)很小,並且不會有明顯的性能損失。

如果您遇到一些性能問題,您可以將Notifications.find({userId: Meteor.userId(), read: false})的結果保存到會話或另一個反應性字典中。這會稍微提高性能,因爲您保存了Minimongo的查詢時間:解析,搜索等。

在服務器上,您應該儘可能小心。服務器瓶頸可能意味着你的整個應用程序不會像想要的那麼快。

瞭解更多關於迷你內存數據庫:https://www.meteor.com/mini-databases

1
  1. 是的。在客戶端,而不是在服務器端。
  2. 您可以在模板上使用{{notifications.count}}。