Несколько диапазонов клавиш в качестве параметров для представления 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 }
]
}
Я знаю, это старый вопрос, но я изначально нашел его, когда искал именно это!