2011-04-01 22 views
6

Tengo varios documentos CouchDB que representan una marca de tiempo con una propiedad userId y etiqueta (un usuario puede tener n marcas de tiempo y asignarle una etiqueta a cada uno). Quiero consultar CouchDB por un userId específico y obtener una lista ordenada de las etiquetas que el usuario ha utilizado (ordenados por ocurrencia).CouchDB Ver equivalente de SUM & GROUP POR

¿Cómo se vería la vista?

Si quiero obtener una lista de todas las etiquetas ordenados por ocurrencia (no importa de qué usuario) o si suponemos que sólo hay documentos con el mismo ID de usuario, que lo haría así:

mapa:

function(doc) { 
    if(doc.tag) emit(doc.tag, 1); 
} 

Reducir:

function(keys, values) { 
    return sum(values); 
} 

pero ¿cómo puedo agrupar el resultado para que pueda filtrar la consulta por un userId específico?

Respuesta

8

Respondiendo a mi propia pregunta.

Parece que CouchDB admite matrices como claves. Con esto en mente, es bastante simple:

Mapa:

function(doc) { 
    if(doc.tag) emit([doc.userId, doc.tag], 1); 
} 

Reducir:

function(keys, values) { 
    return sum(values); 
} 

El resultado es entonces ordenado por ID de usuario & etiqueta.

+3

Solo para agregar a eso, puede usar el parámetro de vista 'group_level' para lograr diferentes niveles de granularidad para sus cálculos de reducción. Probablemente esto se demuestre mejor si usa una fecha como matriz para su clave. '[año, mes, día]'. En este caso, 'group_level = 1' obtendrá el agregado para el año,' group_level = 2' irá por mes y 'group_level = 3' será por día. –

+3

Y otra cosa, si solo usa '_sum' como función de reducción, CouchDB automáticamente usará una función de Erlang preescrita que funcionará mucho más rápido que el equivalente de JavaScript. (otros ejemplos todos documentados [aquí] (http://wiki.apache.org/couchdb/Built-In_Reduce_Functions)) –

+0

Esto no ordena por ocurrencia, sin embargo. –