Несколько диапазонов клавиш в качестве параметров для представления CouchDB

Основная проблема - скажем, мои документы имеют "категории" и временные метки. Если я хочу, чтобы все документы в категории "foo" имели временную метку, которая в течение последних двух часов была простой:

function (doc) {
  emit([doc.category, doc.timestamp], null);
}

а затем запрос как

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|]

проблема возникает, когда я хочу что-то в категориях foo или bar в течение последних двух часов. Если бы я не заботился о времени, я мог бы просто потащить ключ через ключ. к сожалению, у меня нет такой опции с диапазонами.

То, что я закончил, тем временем округляет метку времени до двухчасовых блоков, а затем мультиплексирует запрос:

POST server:5894/.../myview
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]]

Это работает, но будет беспорядочно, если я хочу вернуться к большому количеству времени (в зависимости от блока).

Есть ли способ отправить несколько пар startKey/endKey в представление, похожее на массив ключей: [], который может быть отправлен для ключей?

Ответ 1

Возможно, вам лучше всего сделать два запроса. CouchDB может обрабатывать несколько одновременных запросов довольно хорошо, поэтому отключение нескольких процессов/потоков и запрос для файлов foo и bar отдельно.

В настоящее время CouchDB не поддерживает несколько запросов диапазона. Ключи ORing и ANDing практически не выполняются в одном запросе.

Ответ 2

Существует запрос на выпуск CouchDB, который позволит вам сделать именно это. Я прикрепил простой, без гарантий патч к 0.10.1 к этому билету, который может сработать для вас. Он работает для меня и позволяет мне делать такие вещи, как:

{
    "keys": [
        {
            "startkey": ["0240286524","2010","03","01"],
            "endkey": ["0240286524","2010","03","07",{}]
        },
        {
            "startkey": ["0442257276","2010","03","01"],
            "endkey": ["0442257276","2010","03","07",{}]
        }
    ]
}

в теле POST, что позволяет мне получать все данные по нескольким идентификаторам отслеживания для ряда дат. Я звоню с помощью group=true&group_level=1, чтобы результаты были сгруппированы по идентификатору отслеживания. Более глубокие групповые уровни позволили бы мне группировать, отслеживая id | год, идентификатор отслеживания | год | месяц и т.д.

Несколько соединений были для меня незаменимыми накладными расходами, так как я хотел бы сделать 2000 одновременно:) (Нет, новое представление не является вариантом - мы уже стоим 400 ГБ для данных плюс один вид!)

Проблема и исправление находятся на https://issues.apache.org/jira/browse/COUCHDB-523.

Ответ 3

Это было добавлено в более новые версии CouchDB. Чтобы добавить несколько диапазонов ключей запуска/завершения, вы можете использовать запрос POST для своего представления, с телом, который выглядит примерно так:

{
  "queries": [
    { "startkey": 10, "endkey": 11 },
    { "startkey": 16, "endkey": 18 }
  ]
}

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