2014-11-24 119 views
0

在流星我想在具有Mongo數據庫的文檔級別工作,並且根據消息來源,我必須注意的是昂貴的出版物,所以今天我的問題是:流星:在發佈或客戶端過濾數據

我怎麼會去與關係發佈文檔,我將遵循關係型查詢的地方,我們會發現分配的詳細信息與分配的ID是這樣的:而

enter image description here

Meteor.publish('someName', function() { 
    var empId = "dj4nfhd56k7bhb3b732fd73fb"; 

    var assignmentData = Assignment.find({ employee_id: empId }); 
    return AssignmentDetails.find({ assignment_id: $in [ assignment ] }); 
}); 

還是應該小睡一下proach這樣,我們跳過發佈的過濾步驟,而是發佈每個assignment_detail和處理客戶端上過濾器:

enter image description here

Meteor.publish('someName', function() { 
    var empId = "dj4nfhd56k7bhb3b732fd73fb"; 

    var assignmentData = Assignment.find({ employee_id: empId }); 
    var detailData = AssignmentDetails.find({ employee_id: empId }); 

    return [ assignmentData, detailData]; 
}); 

我想這是數據量是否是一個問題服務器上的搜索槽應該多於或者如果傳輸到客戶端的數據量應該更大。

這些對於服務器來說最符合成本效益?

回答

1

這是一個意見問題,但如果可能的話,我強烈建議將employee_id附加到AssignmentDetails的文檔中,就像您在第二個示例中所述。如果出版物的功能比所需要的更爲複雜,並且您可以將您的酒館功能減少到一行(如果您在AssignmentDetails中有employee_id(即使有許多employee_id用於每個任務)通過只是搜索。您甚至不需要將該字段返回給客戶端(您可以指定要在您的find中返回的字段),因此唯一引起的開銷將在數據庫存儲(這是便宜的)並將其添加到插入/更新AssignmentDetails文檔(這是不可察覺的)。實際傳輸的數據量與第一種情況相同。

只是發佈所有內容的替代方案對於小型集合來說可能沒問題,但它確實取決於分配的數量,並且這種方式根本不可能擴展。每當客戶端連接時,您需要將整個集合發送給客戶端,如果兩端的MB大於MB,那麼這兩個端點都很昂貴且耗時,並且當您談論一個動態的(即經常變化的)集合,我認爲你是這樣的(而對於大部分靜態集合,你可以用localStorage和poll-and-diff做些事情)。