2012-02-08 25 views
6

Czy ktoś może mi wyjaśnić dlaczego następujące nie działa:CouchDB Group oraz kluczowy zakres

Zakładając następującą strukturę dokumentu:

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

i funkcję Mapa zdefiniowane tak:

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

I użycie wbudowanej funkcji _sum dla reduktora.

Po wykonaniu tego (z grupy = true) można uzyskać wyniki tak:

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

Teraz, jeśli zmienić zapytanie do czegoś takiego:

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

uzyskać wyniki jak ten :

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

więc biorąc to pod uwagę, czy chcę, aby dowiedzieć się całej sprzedaży w 2011 roku „WA” może nie ja exe słodkie coś takiego:

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

Przykład ten został zaczerpnięty z przydatnych filmów na co taśm NoSQL.

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

Odpowiedz

8

Zawsze trzeba dać szereg przycisków, ponieważ filtrowanie odbywa się na wynikach map „s, nie na reduce.

Na przykład, poniższe parametry powinny działać (jeśli prawidłowo zakodowany url):

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

Można przeczytać o view collation zrozumieć jak to działa.

+0

Tak, które działało i teraz ma więcej sensu. Dziękuję również za link do przewodnika ViewCollation. – eggsy84

+1

Zakładałem, że zostało to zrobione z wyników etapu Reduce, ale teraz rozumiem, że to zrobione z wyników z funkcji Map. Dzięki za pomoc :) – eggsy84