2017-03-11 53 views
1

輸出I有地圖減少視圖:分組的CouchDB的視圖

..... 

emit(diffYears, doc.xyz); 

reduced with _sum. 

xyz是則其每整數(diffYears)相加的數。

輸出看起來大致是這樣的:

4      1204.9 
5      796.19 
6      1124.8 
7      1112.6 
8      1993.62      
9      159.26 
10      395.41 
11      456.05 
12      457.97 
13      39.80 
14      483.68 
15      269.469 
etc.. 

我想要做的是組結果如下:

Grouping    Total per group 
0-4      1959.2  i.e add up the xyz's for years 0,1,2,3,4 
5-9      3998.5  same for 5,6,7,8,9 ...etc. 
10-14     3566.3 

我看到其中一個視圖中使用列表的建議這裏輸出:Using a CouchDB view, can I count groups and filter by key range at the same time? ,但一直無法適應它以獲得任何類型的結果。 給出的代碼是:

{ 
_id: "_design/authors", 
views: { 
authors_by_date: { 
    map: function(doc) { 
    emit(doc.date, doc.author); 
    } 
} 
}, 
lists: { 
count_occurrences: function(head, req) { 
    start({ headers: { "Content-Type": "application/json" }}); 

    var result = {}; 
    var row; 
    while(row = getRow()) { 
    var val = row.value; 
    if(result[val]) result[val]++; 
    else result[val] = 1; 
    } 
    return result; 
} 
} 
} 

我在本節取代var val = row.key:(雖然在這種情況下,結果是一個計數)

while(row = getRow()) { 
    var val = row.value; 
    if(result[val]) result[val]++; 
    else result[val] = 1; 
    } 

這似乎是順便做到這一點。

(它像具有每個分組,我可以做手動,自然,但不是一個流程內startkey和endkey。或者是有輸入多個開始和endkeys成一個GET命令的方式???? )

對於使用統計分析的研究人員來說,這一定是相當正常的事情。

因此,我假設它完成了,但就CouchDB而言,我找不到示例 。

我將不勝感激這個請幫忙或在正確的方向指針。

非常感謝。

編輯: 也許答案在於'reduce'將輸出分組?

回答

1

您可以使用複雜的關鍵點完成您想要的任務。限制是組大小是靜態的,需要在視圖中定義。

你需要一個簡單的步驟,功能,地圖內創建團體,如:

var size = 5; 
var group = (doc.diffYears - (doc.diffYears % size))/size; 
emit([group, doc.diffYears], doc.xyz); 

reduce函數可以保持_sum。

現在,當您查詢視圖使用group_level來控制分組。在group_level = 0時,所有內容都會相加,並返回一個值。在group_level = 1時,您將收到您想要的0-4,5-9等的總和。在group_level = 2時,您將獲得原始輸出。

+0

@ sarwar謝謝。正是我需要的。 – jlb333333