2015-07-04 30 views
-1

我有一個集合與字段group1,group2group3這些都是數字。流星中的拆分組

我可以使用收集與

Template.tplName.helpers({ 
    rows: function() { 
    return Rows.find({}); 
    }, 
}); 

<template name="tplName"> 
    {{#each rows}} 
    {{group1}}, {{group2}}, {{group3}} 
    {{/each}} 
</template> 

但不是在一頁上打印的所有行,我要他們在多個頁面劃分。

在第一頁上,我想打印所有唯一group1值的列表。如果我點擊一個group1號碼,我將進入另一頁,其中包含所有值的列表,其中包含我剛剛點擊過的group1號碼。當點擊group2號碼時,我將進入一個新頁面,其中包含所有group3值的列表,其中包含我點擊過的group1號碼和group2號碼。

如果我的數據集是

group1, group2, group3, amount 
======================= 
1, 1, 1, 200 
1, 1, 2, 300 
1, 2, 1, 250 
1, 2, 2, 220 
1, 2, 3, 200 
2, 1, 1, 305 
2, 1, 1, 290 

我想的第一頁列出

<li><a href="?">1</a></li> 
<li><a href="?">2</a></li> 

如果我在這第一頁點擊1,我想接下來的第二頁,列出

<li><a href="?">1</a></li> 
<li><a href="?">2</a></li> 

如果我在這第二頁上點擊2,我想要下一個第三頁列表

<li><a href="?">1</a></li> 
<li><a href="?">2</a></li> 
<li><a href="?">3</a></li> 

我希望這是可以理解我想要做:-)

我想我必須檢索整個集合,然後篩選出來。

var rows = Rows.find().fetch(); // fetch all rows 
var group1Numbers = _.pluck(rows, "group1"); // get all group1 numbers 
var group1NumbersUnique _.uniq(group1Numbers); // get all unique group1 numbers 

給我獨特的group1數字。現在我需要一些方法告訴路由器(或其他),我已經點擊了group1號碼中的一個號碼,並且在下一個具有rows = Rows.find({group1: ?})的路線上,而不是顯示所有的行。

但是,如果我使用_.pluck()我得到的組號碼列表 - 這可能是最簡單的方法來刪除重複,但我也需要總和。

我想我可以創建一個模板

<template name="groupList"> 
    {{#each groups}} 
    <p><a href="?">{{name}}</a> (amount: {{amount}})</p> 
    {{/each}} 
</template> 

和路線

this.route('groupListFirst', { 
    path: '/groups', 
    template: 'groupList', 
    waitOn: function() { 
    return [ 
     subs.subscribe('groups'), 
    ] 
    }, 
    data: function() { 
    var group1List = [ 
     { 
     name: "1", 
     amount: 200 + 300 + 250 + 220 + 200, 
     }, 
     { 
     name: "2", 
     budget: 305 + 290, 
     }, 
    ]; 

    return { 
     groups: group1List, 
    } 
    }, 
}); 

和新途徑活躍我已經點擊了1組鏈接之一後,顯示所有屬於該組中2物體到點擊的group1鏈接。 因此,如果用戶點擊「1」的第1個鏈路中,它可能像

this.route('groupListSecond', { 
    path: '/groups', 
    template: 'groupList', 
    waitOn: function() { 
    return [ 
     subs.subscribe('groups'), 
    ] 
    }, 
    data: function() { 
    var group2List = [ 
     { 
     name: "1", 
     amount: 200 + 300, 
     }, 
     { 
     name: "2", 
     budget: 250 + 220 + 200, 
     }, 
    ]; 

    return { 
     groups: group2List, 
    } 
    }, 
}); 

,如果該組中2鏈路中用戶進一步點擊1,這是

this.route('groupListThird', { 
    path: '/groups', 
    template: 'groupList', 
    waitOn: function() { 
    return [ 
     subs.subscribe('groups'), 
    ] 
    }, 
    data: function() { 
    var group3List = [ 
     { 
     name: "1", 
     amount: 200, 
     }, 
    ]; 

    return { 
     groups: group3List, 
    } 
    }, 
}); 

這些路線手動創建,因爲我不知道如何自動執行此操作,並註冊用戶單擊的鏈接,只顯示與此組相關的對象。

我想這應該從集合中完成,每個文檔都有多個組編號,但是如果我不能用這個結構來完成,我將不得不將每個組分割成不同的集合。

+0

我無法理解您的數據以及如何將每條記錄分解成頁面(無,1,2)? group1對group3有什麼意義? –

+0

而不是將每個組存儲到每條記錄時,爲什麼不將這些值存儲爲group1,group2,group3的三條記錄(組):{group:1,values:[1,2 ]},{group:2,values:[1,2]},{group:3,values:[1,2,3]} –

+0

對不起,如果問題不清楚。我有一個集合的集合。但我沒有列出所有的組,而是創建了一些映射。所以我在組合集中添加了一些字段來表示/模仿一些關卡。 – Jamgreen

回答

1

有很多零件的長問題!所以這將是一個很長的答案,有很多部分。多多包涵:1

部分:彙總

不,流星不(還)支持蒙戈級聚集。有(這在服務器上)的包,但不是客戶端迷你蒙哥。所以你是正確的,你需要拉所有記錄,並自己做(現在)。但是,你也提到你想要總結數據(我認爲這是基於會計的評論),所以_.pluck()不夠好。也許你可以使用一個_.groupBy()_.reduce()一個_.map()內 - 也許是這樣的:

var group1Totals = _.map(_.groupBy(rows, "group1"), function(documents, key) { 
    return {groupId: key, 
      total: _.reduce(documents, function(acc, doc) { 
        return acc += doc.amount; 
       }, 0)}; 
}; 

這應該給你的對象一個新的數組(稱爲group1Totals)與group1total性能。這足以作爲模板助手返回(Meteor將遍歷數組以及{{#each}}塊中的遊標)。您稍後可以重複使用此代碼,以僅獲取組2的總計,但不是以全部(rows)開始,您可以使用_.filter()將篩選列表傳遞到_.groupBy(),並按「組2」進行分組。

第2部分:路由

鐵路由器確實允許parameters to be passed以及數據背景來設定。您需要定義您的路線以包含參數,然後設置您的鏈接以傳遞這些參數。同樣,你的路線的一個例子是:

Router.route('/group1/:groupId', { 
    data: function() { 
    var groupId = this.params.groupId; 
    return Rows.find({group1: groupId}); 
    } 
}); 

這將模板的數據上下文(this)設置爲您所選擇的行的子集。但是,您還需要確保鏈接使用正確的參數調用路由。鐵路由器也爲此提供了一個內置的輔助,pathFor,你可以在你的模板中使用這樣的(使用上面定義的結構):

<template name="groupList"> 
    {{#each groups}} 
    <p> 
     <a href="{{pathFor route='group1' groupId=groupId}}"> 
     {{name}} 
     </a> 
     (amount: {{total}}) 
    </p> 
    {{/each}} 
</template> 

你應該再重複此(適當調整)爲每你的三個小組。記住第2組需要包含第1組和第2組的.find()選擇,因此您可能需要兩個路由參數。

尾註

這可能是考慮到你當前結構的最簡單的方法。我不確定反規範化對於會計系統是否合適或想要。或者甚至在這個問題上使用NoSQL!不過,我會假設您使用此功能進行報告,而不是記錄。這裏的解決方案是嚴格的3組方法,其他組需要手動添加。你可以做得更加動態,但是你當前的數據結構並不適合這樣做。您可能需要查看層次關係和節點與葉子結構。遠遠超出了這個問題的範圍!

我認爲這是你需要/已經要求的一切。