2012-04-11 9 views
5

Ich weiß, dass es die eingebaute _stats Funktion gibt, die Ihnen Summe, Anzahl, Min, Max und Summenquare gibt. Was ich gerne wissen würde, ist, wie man das Maximum auf eine Karte reduzieren kann. Ich kann keine Reduce-Funktion entwickeln, die ohne weitere Informationen funktioniert.Wie berechnet man Max-Wert mit Map-Reduce in CouchDB?

Das einzige, was mir einfällt, ist die Sortierung nach dem Wert und die Auswahl des ersten Wertes.

My Map-Funktion sieht wie folgt aus:

function(doc){ 
    emit(null, doc.value); 
} 
+1

Ihre Abhilfe (Sortierung nach Wert und Kommissionierung des ersten oder letzten Eintrags) nicht mit Ihrer Map-Funktion arbeitet gelöst werden kann - eine Ansicht, sortiert nach Schlüssel, Sie müssten also doc.value anstelle von null als Schlüssel ausgeben. Aber anstelle einer solchen Problemumgehung können Sie die Kartenfunktion mit einer entsprechenden Reduzierungsfunktion kombinieren. – titanoboa

Antwort

8

Das couchdb Wiki bietet eine einfache example for sum.

Anstatt die Summe der Werte zurückzugeben, sollte eine Reduzierungsfunktion für max das Maximum des Wertearrays zurückgeben. Da die Berechnung des Maximums kommutativ, assoziativ usw. ist, müssen Sie sich keine Gedanken über die Wiederverwendung machen.

function (key, values, rereduce) { 
    // Return the maximum numeric value. 
    var max = -Infinity 
    for(var i = 0; i < values.length; i++) 
     if(typeof values[i] == 'number') 
      max = Math.max(values[i], max) 
    return max 
} 
+0

Ich habe mir die Freiheit genommen, Ihre Antwort so zu erweitern, dass ich sicher bin, dass sie das Problem von PPC-Coder lösen wird. – JasonSmith

+1

Gibt es eine ähnliche Möglichkeit, das maximale Datum für eine Reihe von Zeilen zu finden? – user2601010

10

Dies auch durch die folgende

function (key, values, rereduce) { 
    return Math.max.apply({}, values); 
}