2012-02-08 13 views
6

Puede alguien explicarme por qué el siguiente no funciona:CouchDB Group y Key Range

Suponiendo que la estructura siguiente documento:

{ 
    "_id": "520fb089a6cb538b1843cdf3cca39a15", 
    "_rev": "2-f96c27d19bf6cb10268d6d1c34799931", 
    "type": "nosql", 
    "location": "AZ", 
    "date": "2012/03/01 00:00:00", 
    "amount": 1500 
} 

y una función de mapa definido de este modo:

function(doc) { 
    var saleDate = new Date(doc.date); 
    emit([doc.location,saleDate.getFullYear(),saleDate.getMonth()+1],doc.amount); 
} 

Y usando la función integrada _sum para el reductor.

Cuando se ejecuta este (con el grupo = true) se obtiene resultados como este:

{"rows":[ 
{"key":["AZ",2012,2],"value":224}, 
{"key":["AZ",2012,3],"value":1500}, 
{"key":["WA",2011,12],"value":1965}, 
{"key":["WA",2012,1],"value":358} 
]} 

Ahora bien, si cambia la consulta a algo como esto:

http://127.0.0.1:5984/default/_design/nosql/_view/nosql_test?group_level=2 

Se obtienen resultados como este :

{"rows":[ 
{"key":["AZ",2012],"value":1724}, 
{"key":["WA",2011],"value":1965}, 
{"key":["WA",2012],"value":358} 
]} 

Así que con eso en mente si quería saber todas las ventas en 2011 para "WA" podría no exe lindo algo como esto:

http://127.0.0.1:5984/default/_design/nosql/_view/nosql_test?group_level=2&key=["WA",2011] 

Este ejemplo ha sido tomado de los videos útiles en cintas NoSQL.

http://nosqltapes.com/video/understanding-mapreduce-with-mike-miller

Respuesta

8

Siempre hay que dar una serie de llaves, ya que se realiza el filtrado de los resultados map 's, no en reduce.

Por ejemplo, los siguientes parámetros deben trabajar (si es adecuadamente codificada en URL):

?group_level=2&startkey=["WA",2011]&endkey=["WA",2011,{}] 

Usted puede leer sobre view collation para entender cómo funciona.

+0

Sí, eso funcionó y tiene más sentido ahora. Gracias por el enlace a la guía ViewCollation también. – eggsy84

+1

Supongo que se hizo a partir de los resultados de la etapa Reducir, pero ahora entiendo que se hace a partir de los resultados de la función Mapa. Gracias por la ayuda :) – eggsy84