2012-04-11 23 views
5

Wiem, że jest wbudowana funkcja _stats, która daje sumę, liczbę, min, maks i sumsqr. To, co chciałbym wiedzieć, to jak obliczyć max na mapie - zmniejszyć sposób. Nie mogę wymyślić funkcji redukcji, która zadziała bez dodatkowych informacji.Jak obliczyć wartość maksymalną za pomocą funkcji Map-Reduce w CouchDB?

Jedyne, co mogę wymyślić, to użyć sortowania według wartości i wybrać pierwszą wartość.

Moja funkcja mapa wygląda następująco:

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

Twój obejście (sortowanie pod względem wartości i zbierając pierwszy lub ostatni wpis) nie będzie pracować z funkcji mapy - widok jest posortowana według klucza, więc musisz wydać wartość doc.value zamiast wartości null jako klucza. Zamiast takiego obejścia można jednak połączyć funkcję mapy z odpowiednią funkcją redukcji. – titanoboa

Odpowiedz

8

couchdb wiki zapewnia prosty example for sum.

Zamiast zwracać sumę wartości, funkcja zmniejszenia dla maks powinna zwracać maksimum wartości tablicy. Ponieważ obliczanie maksimum jest przemienne, asocjacyjne itp., Nie musisz się martwić o reredukcję.

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

Pozwoliłem sobie poszerzyć twoją odpowiedź o to, co jestem pewien, że rozwiąże problem PPC-Coder'a. – JasonSmith

+1

Czy istnieje podobny sposób znalezienia maksymalnej daty dla zestawu wierszy? – user2601010

10

ten może być również rozwiązana przez następujący

function (key, values, rereduce) { 
    return Math.max.apply({}, values); 
} 
Powiązane problemy