2014-10-29 145 views
0

我有一個最近變得非常大的集合。我曾經使用myapp中的搜索字段來訂閱它正在執行的所有文檔。訂閱大集合

有了這個較大的集合,它需要大量的時間來加載。

你會推薦什麼來降低加載時​​間,但仍然在整個集合上搜索電源?

我可以通過客戶端訂閱集合的一部分(執行我的搜索查詢)嗎?

我現在有:

我的路由器:

waitOn: function(){ 
    return [Meteor.subscribe('files')]; 
}, 

我的客戶端(當搜索按鈕點擊):

'click #search':function(e,context) { 
    Session.set("keywords",$("#search_input").val()); 
} 

模板

Template.filwsList.helpers({ 
    files_results: function() { 
    var keywords = new RegExp(Session.get("keywords"), "i"); 
    var result = Files.find({$or:[{name:keywords},{description:keywords},{tags:keywords}]},{sort: {updatedAt: 1}}); 
    return result; 
    } 
}) 
+1

我問一個類似的主題一個問題,你可能會覺得很有用。 http://stackoverflow.com/questions/26225840/canonical-way-to-use-jqueryui-autocomplete-with-meteor。它列出瞭如何使用pub/sub或使用服務器方法搜索大型集合,以及兩者的示例。 – 2014-10-30 23:25:40

回答

1

解決方案是定義一個publish function在服務器上使用搜索關鍵字作爲參數。

Meteor.publish('files', function publishFunction(keywords) { 
    check(keywords, String); // https://docs.meteor.com/#/full/check_package 
    return Files.find({ 
    $or: [ 
     { name: keywords }, 
     { description: keywords }, 
     { tags: keywords } 
    ]}, { 
     sort: ... 
     limit: ... 
     fields: ... 
    } 
); 
}); 

然後在客戶端上,通過keywords作爲參數:

waitOn: function() { 
    return Meteor.subscribe('files', keywords); 
} 

這也是值得注意的是,有可能會做你想要什麼已經,例如包autocompletedatatables

請參閱瞭解流星發佈/訂閱。

+2

爲了安全(和社區意識),我建議在回答具有發佈功能的問題時始終包括輸入檢查。 – 2014-10-29 06:09:11

+0

每次客戶端訂閱時都會調用發佈函數。在這種情況下,發佈發生在路由上,我猜是搜索表單所在的頁面。當路由代碼被調用 - 所以發佈功能 - 關鍵字對象仍然是空的(用戶還沒有輸入關鍵字)...搜索然後將使用underfined作爲$或參數... – alexdown 2014-10-29 06:41:28

+0

@DavidWeldon:已更新, 謝謝! – 2014-10-29 08:14:03

0

您應該嘗試發佈儘可能少的數據。

僅發佈(訂閱)搜索中使用的集合的字段(請參閱http://docs.meteor.com/#find)並編寫一個方法,該方法通過id返回整個File對象,並在搜索後調用它(當您顯示文件內容或其他)。

其他選項,你可以只是做搜索服務器端,而不會發布Files集合,但結果不會有太大的「流星十歲上下的」 ...