2012-02-08 3 views
6

Может кто-нибудь объяснить мне, почему следующее не работает:CouchDB Group и Key Range

Предполагая следующую структуру документа:

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

и функцию Map, определенный следующим образом:

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

И используя встроенную функцию _sum для редуктора.

При выполнении этого (с группой = истина), вы получите результаты, как это:

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

Теперь, если вы измените запрос на что-то вроде этого:

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

Вы получаете результаты, как это :

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

Так с этим в виду, если я хочу, чтобы выяснить, все продажи в 2011 году на «WA» я не мог Exe что-то вроде этого:

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

Этот пример был взят из полезных видеороликов на лентах NoSQL.

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

ответ

8

Вы всегда должны дать диапазон ключей, потому что фильтрация осуществляется по результатам map «s, не на reduce.

Например, следующие параметры должны работать (если правильно URL-кодировке):

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

Вы можете прочитать о view collation, чтобы понять, как это работает.

+0

Да, это сработало и имеет больше смысла. Спасибо за ссылку на руководство ViewCollation. – eggsy84

+1

Я предполагал, что это было сделано по результатам этапа «Снижение», но теперь понимаем, что это сделано из результатов функции «Карта». Спасибо за помощь :) – eggsy84

Смежные вопросы