2017-03-11 10 views
1

Gruppierung I haben eine Kartenansicht reduzieren:die Ausgabe eines CouchDB Ansicht

..... 

emit(diffYears, doc.xyz); 

reduced with _sum. 

xyz ist dann eine Zahl, die pro ganze Zahl summiert wird (diffYears).

Die Ausgabe sieht in etwa wie folgt aus:

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.. 

Was würde Ich mag es, die Ergebnisse Gruppe tun, wie folgt:

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 

ich einen Vorschlag sah, wo eine Liste auf einer Ansicht verwendet wurde Ausgabe hier: Using a CouchDB view, can I count groups and filter by key range at the same time? aber konnte nicht angepasst werden, um irgendein Ergebnis zu erhalten. Der Code gegeben ist:

{ 
_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; 
} 
} 
} 

I var val = row.key in diesem Abschnitt ersetzt: (. Obwohl das Ergebnis in diesem Fall ist eine Zählung)

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

Dies scheint der Weg zu sein TU es.

(Es ist wie ein Start-und Endkey für jede Gruppierung, die ich manuell tun kann, natürlich, aber nicht in einem Prozess. Oder gibt es eine Möglichkeit, mehrere Start- und Ende-Tasten in einen GET-Befehl einzugeben ????)

Dies muss eine ziemlich normale Sache sein, besonders für Forscher, die statistische Analyse verwenden.

Ich nehme daher an, dass es getan wird, aber ich kann Beispiele nicht finden, soweit CouchDB betroffen ist.

Ich würde einige Hilfe mit diesem bitte oder einen Zeiger in die richtige Richtung schätzen.

Vielen Dank.

EDIT: Vielleicht liegt die Antwort in einem Prozess in "reduzieren", um die Ausgabe zu gruppieren?

Antwort

1

Sie können mit einem komplexen Schlüssel erreichen, was Sie wollen. Die Einschränkung besteht darin, dass die Gruppengröße statisch ist und in der Ansicht definiert werden muss.

Sie erhalten eine einfache Schritt-Funktion benötigen, um Ihre Gruppen innerhalb der Karte wie zu erstellen:

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

Die verringern Funktion bleiben _sum können.

Wenn Sie jetzt die Ansicht abfragen, verwenden Sie group_level, um die Gruppierung zu steuern. Bei group_level = 0 wird alles summiert und ein Wert wird zurückgegeben. Bei group_level = 1 erhalten Sie Ihre gewünschten Summen von 0-4, 5-9 usw. Bei group_level = 2 erhalten Sie Ihre ursprüngliche Ausgabe.

+0

@ sarwar Danke. Genau das, was ich brauchte. – jlb333333

Verwandte Themen