2009-10-19 13 views
17

Sí, soy un jinete de SQL (sorta) que entra en el mundo de CouchDb Map/Reduce. Pensé que había descubierto cómo el equivalente de la función agregador de SQL COUNT (*) para CouchDB conjuntos de datos con la siguiente:¿Cuál es el equivalente de CouchDB de la función de agregado de SQL COUNT (*)?

Mapa:

function(doc) { 
    emit(doc.name, doc); 
} 

Reducir:

function(keys, values, rereduce){ 
    return values.length; 
} 

Lo que me pareció funcionó, devolviendo algo como:

"super fun C" 2 
"super fun D" 2 
"super fun E" 2 
"super fun F" 18 

... pero no realmente. Cuando agrego un registro, este recuento varía enormemente. A veces, el conteo realmente disminuye, lo que fue muy sorprendente. ¿Estoy haciendo algo mal? Tal vez no entiendo completamente el concepto de consistencia final?

Respuesta

22

Parece que sus resultados de reducción se vuelven a reducir. Es decir, reduce se llama más de una vez por cada tecla y luego se vuelve a llamar con esos resultados. Puede manejar eso con una función reduce así:

function(keys, values, rereduce) { 
    if (rereduce) { 
    return sum(values); 
    } else { 
    return values.length; 
    } 
} 

Alternativamente, se puede cambiar la función map de manera que los valores son siempre un recuento de los documentos:

// map 
function(doc) { 
    emit(doc.name, 1); 
} 

// reduce 
function(keys, values, rereduce) { 
    return sum(values); 
} 
+0

Usar las funciones de reducción de javascript en lugar de las incorporadas le dará un rendimiento muy malo. Vea la respuesta de David – wallacer

31

En su reducen sólo hay que poner:

_count

también puede obtener una suma usando:

_sum

así que básicamente reducen: "_sum" o reducir: "_count" y asegúrese de que el valor de su mapa emite es un número entero válido (valor numérico)

Ver "Built in reduce functions".

+1

Esta es la mejor respuesta. Lea el enlace que David publicó aquí acerca de las funciones incorporadas. – Lander

+0

¡Esta es en realidad la respuesta correcta! –

Cuestiones relacionadas