2012-02-08 8 views
6

Qualcuno può spiegare a me perché il seguente non funziona:CouchDB Group e Key Range

Assumendo la seguente struttura del documento:

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

E una funzione Map definita in questo modo:

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

E utilizzando la funzione integrata _sum per il riduttore.

Quando si esegue questa (con il gruppo = true) si ottengono risultati come questo:

{"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} 
]} 

Ora, se si modifica la query per qualcosa di simile:

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

È possibile ottenere risultati come questo :

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

Quindi, con questo in mente se volevo scoprire tutte le vendite nel 2011 per "WA" non potevo exe carino qualcosa del genere:

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

Questo esempio è stato preso dai video utili su nastri NoSQL.

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

risposta

8

Hai sempre bisogno di dare una serie di chiavi, perché il filtro è fatto su risultati map s', non su reduce.

Per esempio, i seguenti parametri devono lavorare (se adeguatamente con codifica URL):

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

Si può leggere su view collation per capire come funziona.

+0

Sì, ha funzionato e ora ha più senso. Grazie anche per il link alla guida di ViewCollation. – eggsy84

+1

Stavo partendo dal presupposto che sia stato ottenuto dai risultati della fase di riduzione, ma ora capisco che è stato eseguito dai risultati della funzione Mappa. Grazie per l'aiuto :) – eggsy84