arrays date mapreduce couchdb

arrays - couchdb map/reduce las claves mĂșltiples que filtran por fecha



date mapreduce (1)

Tengo una configuración de vista con un mapa de reducir. En este momento, este código funciona muy bien:

function(doc) { if (doc.type == ''test''){ if(doc.trash != 1){ for (var id in doc.items) { emit([id,doc.items[id].name], 1); } } } } function(keys,prices){ return (keys, sum(prices)); }

Obtengo un retorno y al usar el parámetro de grupo, condensa todo muy bien.

Mi problema / pregunta, quiero agregar una tercera clave ... FECHA, por lo que solo puedo reducir los registros de ciertas fechas. Así por ejemplo:

function(doc) { if (doc.type == ''test''){ if(doc.trash != 1){ for (var id in doc.items) { emit([date,id,doc.items[id].name], 1); } } } }

Mi problema es que debido a que la fecha está al comienzo de la matriz, reduzco los grupos por fecha, identificación, etc. Sé que utilizo group_level y digamos que solo tomo la primera clave de la matriz o las primeras 2 teclas, pero eso no ayuda ya sea porque afaik, group_level va de izquierda a derecha en la matriz. Podría poner la fecha al final de la matriz de emisión, pero eso tampoco ayuda, porque necesito tener valores al principio de mi clave de inicio y de fin para buscar.

Aquí hay un ejemplo del resultado de los datos:

{"key":["2012-03-13","356752b8a5f6871f3","Apple"],"value":1}, {"key":["2012-03-20","123752b8a76986857","Pear"],"value":1}, {"key":["2012-04-12","3013531de05871194","Grapefruit"],"value":1}, {"key":["2012-04-12","356752b8a5f6871f3","Apple"],"value":1},

Quiero que se agregue APPLE en una fila, aquí se suman las manzanas por fecha primero. Pude resumir todas las manzanas con éxito si eliminé DATE como la primera clave de la matriz, pero luego no puedo buscar por rango de fechas.

¿Alguna idea sobre cómo lograr esto?


Si entiendo correctamente lo que quieres hacer, querrás poner la fecha como el primer elemento de tu matriz, y usar group_level así como start_key y end_key.

P.ej. startkey=[1, "someid"] endkey=[1,"someid",{}] group_level=2

Obtendrá todos los artículos a partir de la fecha 1 (obviamente, elija su propio formato aquí), con id "someid" y cualquier nombre. Parece gracioso que emita id''s before names, y sin tener más información acerca de lo que realmente está tratando de lograr, es difícil aconsejar su modelo de datos general. Si el ID es una identificación de "tipo", lo que significa que muchos elementos comparten el mismo ID, entonces esto tiene sentido. Si ID es una ID única por artículo, entonces no es así. En ese caso, querrá emitir "nombre" antes de la ID ...

Editar 1

Según su comentario, para hacer un rango de fechas, haga esto:

startkey=[1] endkey=[5,{}] group_level=2

Obtendrá todo desde la fecha 1 hasta la fecha 5 agrupados por id, es decir. apples , oranges , etc. Utilizo esta técnica exacta en una aplicación de producción a gran escala. En realidad, he formateado las fechas como números enteros fácilmente legibles para seres humanos del formato aaaammdd, por lo que 20140624 clasificaría en la parte superior. Si quiero todo desde el comienzo del mes hasta ahora agrupado por mis ID de grupo, llamo

startkey=[20140601] endkey=[20140624,{}] group_level=2

Funciona perfectamente y, por lo que yo sé, eso es lo que estás buscando hacer. También tengo un tercer "detalle" de capa de clave que me permite proporcionar un nivel de agrupación más profundo para los elementos que lo necesitan. Entonces puedo llamar

startkey=[20140601, "someid"] endkey=[20140624, "someid",{}] group_level=3

Para explorar el nivel de detalle de un ID en particular, o simplemente usar la consulta anterior con group_level=3 si quiero los detalles para cada id. Estoy seguro de que puede hacer que esto funcione; he resuelto este problema exacto en una aplicación de producción utilizando las técnicas descritas.

Editar 2

Si desea agrupar todas las manzanas independientemente de la fecha, deberá dejar que las manzanas sean el primer elemento de la clave. Luego puede obtener todas las manzanas en todo momento como una sola fila en el resultado de la vista usando group_level=1 , y las manzanas en un rango de fechas usando group_level=2 . La diferencia aquí es que solo podrá hacer la consulta group_level=2 en un solo tipo de elemento a la vez. Si quieres lo mejor de ambos mundos, desafortunadamente solo necesitas hacer 2 visitas. Así es cómo funciona el orden de claves ... Si necesita tiempos de respuesta rápidos para ambos tipos de consultas, todos los tipos de elementos en un rango de fechas y todos los elementos en particular no agrupados por fecha, creo que 2 vistas es la única manera de lograr ese.

Nota

Otra cosa a tener en cuenta es acerca de su función de reducción. Siempre que sea posible, se recomienda encarecidamente que utilice las funciones incorporadas de reducción. Se implementan en erlang y están altamente optimizados en comparación con las funciones personalizadas de reducción de javascript.

En tu caso, simplemente reemplaza tu función de reducción con esto

_sum

Fácil, ¿eh?

Si publica más información sobre su aplicación, modelo de datos, etc., me complacerá ayudarlo con el diseño de su base de datos.