Как суммировать значения представления в диапазоне дат, используя couchdb? - PullRequest
5 голосов
/ 09 июня 2011

Если у меня есть функция карты, выдающая метку времени в качестве ключевого и число в качестве документа, как получить сумму значений при выборе диапазона дат?

РЕДАКТИРОВАТЬ пример документа:

{
   "_id": "[2011, 6, 7, 10, 55]",
   "_rev": "1-f87d54608d36cd2e28add67e88e416a4",
   "volt": 107,
   "ampere": 23.5
}

вид:

{
   "_id": "_design/power",
   "_rev": "1-7788287ab51c480c725498eba4f79ddb",
   "language": "javascript",
   "views": {
       "watt": {
           "map": "function(doc) {\n  emit(doc._id, doc.volt * doc.ampere);\n}"
       }
   }
}

Мне нужно запросить, например: среднее значение за час в марте месяце.

Ответы [ 2 ]

6 голосов
/ 09 июня 2011

Я вижу проблему с тем, что ваша функция карты испускает ваш _id в качестве ключа, когда вы хотите выполнить запрос диапазона по информации о дате.Вы должны сохранить информацию о дате в отдельном поле._Id должен быть строкой, и вы не сможете правильно выполнить запрос startkey-endkey.

Что-то вроде:

{
   "_id": "997b9f758899f102ab58570686001bc2",
   "_rev": "1-f87d54608d36cd2e28add67e88e416a4",
   "date": [2011, 6, 7, 10, 55],
   "volt": 107,
   "ampere": 23.5
}

Тогда ваш проектный документ превратится вчто-то вроде:

{
   "_id": "_design/power",
   "_rev": "1-7788287ab51c480c725498eba4f79ddb",
   "language": "javascript",
   "views": {
       "watt": {
           "map": "function(doc) {\n  emit(doc.date, doc.volt * doc.ampere);\n}",
           "reduce": "_sum"
       }
   }
}

Вы можете использовать групповой уровень для управления возвратом информации на основе вашего ключа [год, месяц, день, час, минута].Групповой уровень 1 будет иметь итоговые значения за год, 2 месяца и т. Д. Кроме того, вы можете отфильтровать его с помощью startkey и endkey.

GET db/_design/power/_view/watt?group_level=2

Должно дать вам что-то похожее на:

{"rows":[
 {"key":[2011,4],"value":1988.5},
 {"key":[2011,5],"value":1988.5},
 {"key":[2011,6],"value":7778.0}
]}

Удаление группировки и фильтрации по ключевому диапазону также может дать вам необходимую информацию, но она будет выглядеть по-другому.

GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]

{"rows":[
{"key":null,"value":3977.0}
]}

Объединение их в обе группы для группировки значений перед сокращением и отфильтровыванием нежелательных месяцев.

GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]&group_level=2

{"rows":[
{"key":[2011,4],"value":1988.5},
{"key":[2011,5],"value":1988.5}
]}

В любом случае, просто пытаясь быть тщательным ... также помогает мне запомнить этот материал.

CouchDB HTTP View API - Параметры запросов

РЕДАКТИРОВАТЬ:

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

GET db/_design/power/_view/watt?startkey=[2011,4]&endkey=[2011,6]&group_level=4

{"rows":[
{"key":[2011,4,9,11],"value":1988.5},
{"key":[2011,5,9,11],"value":1988.5}
]}

Боюсь, что в моей тестовой базе данных не было очень полезной информации, ноНадеюсь, я показал, как можно использовать startkey / endkey и group_level.

0 голосов
/ 09 июня 2011

Вы можете использовать _sum как reduce:

"reduce":"_sum"

Затем вам нужно запросить ваше представление с соответствующим уровнем группы и startkey и endkey:

GET db/_design/power/_view/watt?group_level=2&startkey=[2011,3]&endky=[2011,4]&inclusive_end=false

Это дает вам сумму за март месяц. форматирование

...