Уровень группы CouchDB и диапазон клавиш - PullRequest
7 голосов
/ 08 февраля 2012

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

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

{
   "_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 для редуктора.

Когда вы выполняете это (с group = true), вы получаете следующие результаты:

{"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", я бы не смог выполнить что-то вроде этого:

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

1 Ответ

8 голосов
/ 09 февраля 2012

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

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

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

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

...