list - example - pouchdb batch_size
¿Por qué el límite de reducción de CouchDB está habilitado por defecto?(¿Es mejor aproximar SQL JOINS en las vistas de MapReduce o en las vistas de lista?) (1)
Estoy usando CouchDB, y quiero hacer un mejor uso de MapReduce al consultar datos.
Mi caso de uso exacto es el siguiente:
Tengo muchas encuestas. Cada encuesta tiene un meterNumber, meterReading y meterReadingDate, por ejemplo:
{
meterNumber: 1,
meterReading: 2050,
meterReadingDate: 1480000000000
}
Luego utilizo una función de Mapa, produzco lecturas por meterNumber. Hay muchas teclas que se repiten (leyendo el mismo medidor en diferentes fechas). es decir
[
[meterNumber, {reading: xxx, readingDate: xxx}],
[meterNumber, {reading: xxx, readingDate: xxx}],
[meterNumber, {reading: xxx, readingDate: xxx}],
etc
]
Luego, los agrupo antes de enviarlos a la función de reducción, y la función de reducción realmente debe EXPANDIR los valores establecidos. Es decir, quiero esto:
[
[meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
[meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
[meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
etc
]
Para ejecutar esta vista de MapReduce en CouchDB tuve que permitir este tipo de conjunto de resultados ( Couchdb - ¿Es posible desactivar el error de reduction_overflow_error? ).
Esto me sugiere que puedo encontrarme con problemas de rendimiento con grandes conjuntos de resultados. ¿Es este el caso? ¿Por qué tendrías que habilitar específicamente esta configuración en CouchDB?
*** EDITAR
La respuesta aceptada a continuación me indicó que lo que estaba haciendo en MapReduce también era posible (y mejor) usando listas. Aquí hay otra buena respuesta de desbordamiento de pila sobre el mismo tema: La mejor forma de hacer uno-a-muchos "UNIRSE" en CouchDB
*** EDITAR
Aquí hay una referencia de la documentación de CouchDB: http://guide.couchdb.org/draft/transforming.html
Una función de reduce
tiene la intención de reducir los valores asociados con claves dadas.
CouchDB reduce_limit
está aquí para detectar funciones de reducción mal diseñadas, que es lo que hiciste mediante la concatenación de valores ... Pero no entres en pánico: cualquier recién llegado en CouchDB haría el mismo error.
El problema con la concatenación de valores en una función de reduce
es que:
- es totalmente innecesario (si necesita toda la lista, solo use una sola función de
map
), - es muy ineficiente: su índice será cada vez más grande en su disco, y tendrá más y más tiempo de acceso al disco.
Entonces ... Simplemente escriba una función de map
mínima tal como:
function(o){
emit(o.meterNumber);
}
No escriba ninguna función de reduce
. Y llame a la vista con include_docs=true
.
Pero tal vez no estaba satisfecho con el formato de datos? No hay problema: tiene funciones de list
para esto. Solo recuerde que reduce
funciones de map
y reduce
deben usarse para el procesamiento de datos puros, no para fines de formateo.