2011-06-09 11 views
5

Si tengo una función de mapa emitiendo una marca de tiempo como clave y un número como documento, ¿cómo obtener la suma de valores seleccionando un rango de fechas?cómo sumar valores de una vista en un rango de fechas usando couchdb?

EDITAR un ejemplo, el documento es:

{ 
    "_id": "[2011, 6, 7, 10, 55]", 
    "_rev": "1-f87d54608d36cd2e28add67e88e416a4", 
    "volt": 107, 
    "ampere": 23.5 
} 

la vista es:

{ 
    "_id": "_design/power", 
    "_rev": "1-7788287ab51c480c725498eba4f79ddb", 
    "language": "javascript", 
    "views": { 
     "watt": { 
      "map": "function(doc) {\n emit(doc._id, doc.volt * doc.ampere);\n}" 
     } 
    } 
} 

necesito para consultar por ejemplo .: el promedio por hora en el mes de marzo.

+0

Incluya documentos de muestra y la fuente de función de mapa –

Respuesta

6

Veo un problema con la función de mapa que emite su _id como clave cuando desea hacer una consulta de rango en la información de fecha. Deberías guardar la información de la fecha en un campo separado. El _id tiene que ser una cadena y no podrá realizar correctamente la consulta startkey-endkey en él.

Algo así como:

{ 
    "_id": "997b9f758899f102ab58570686001bc2", 
    "_rev": "1-f87d54608d36cd2e28add67e88e416a4", 
    "date": [2011, 6, 7, 10, 55], 
    "volt": 107, 
    "ampere": 23.5 
} 

A continuación, el documento de diseño se convertiría en algo como:

{ 
    "_id": "_design/power", 
    "_rev": "1-7788287ab51c480c725498eba4f79ddb", 
    "language": "javascript", 
    "views": { 
     "watt": { 
      "map": "function(doc) {\n emit(doc.date, doc.volt * doc.ampere);\n}", 
      "reduce": "_sum" 
     } 
    } 
} 

Puede utilizar el nivel de grupo para controlar la forma en que la información viene basa en la clave de [ año, mes, día, hora, minuto]. El nivel 1 del grupo sería total por un año, 2 meses, etc. Además de eso, puede filtrarlo con la tecla de inicio y la tecla de finalización.

GET db/_design/power/_view/watt?group_level=2

deben darle la espalda algo similar a:

{"rows":[ 
{"key":[2011,4],"value":1988.5}, 
{"key":[2011,5],"value":1988.5}, 
{"key":[2011,6],"value":7778.0} 
]} 

Caída de la agrupación y filtrado con un rango de teclas también se puede obtener la información que desea, sino que va a tener un aspecto diferente.

GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]

{"rows":[ 
{"key":null,"value":3977.0} 
]} 

integración de estas plantas a la vez para agrupar los valores antes de reducir y filtrar los meses que no desea.

GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]&group_level=2

{"rows":[ 
{"key":[2011,4],"value":1988.5}, 
{"key":[2011,5],"value":1988.5} 
]} 

De todos modos, tratando de ser cuidadoso ... También me ayuda a recordar estas cosas.

CouchDB HTTP View API - Query Options

EDIT:

me di cuenta de que usted mencionó querer grupo por hora. Usted continuaría el nivel de agrupación hasta la parte de la hora de su clave.

GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]&group_level=4

{"rows":[ 
{"key":[2011,4,9,11],"value":1988.5}, 
{"key":[2011,5,9,11],"value":1988.5} 
]} 

Me temo que mi base de datos de prueba no tiene información muy útil, pero espero exhibidas cómo startkey/endkey y group_level puede ser utilizado.

0

Puede utilizar el _sum incorporada como reduce:

"reduce":"_sum" 

Luego hay que consultar su punto de vista con el nivel de grupo adecuada y un startkey y endkey:

GET db/_design/power/_view/watt?group_level=2&startkey=[2011,3]&endky=[2011,4]&inclusive_end=false 

Eso le da la suma del mes de marzo. formateo

+0

Necesito hacer una tabla con la suma horaria de los valores restringidos a marzo. Así que no necesito un número con la suma de todo el mes de marzo. – fdb

Cuestiones relacionadas