CouchDB Где соединение
Я застрял со следующей проблемой в couchdb. Представьте себе следующую документацию
{Имя:"тест", метка времени:12334567, стоимость:335}
Моя задача состоит в том, чтобы запросить все документы на конкретном таймфрейме, которые имеют значение больше X. В SQL это будет что-то вроде
SELECT * FROM doc, где отметка времени>=X и отметка времени
Значение Z должно быть динамическим, поэтому я не могу просто отфильтровать перед генерацией.
Я уже работал с startkey & endkey, но этот пост Как именно startkey и endkey работают в CouchDB? помог мне понять, что это был неправильный подход.
Может кто-нибудь дать мне подсказку, как можно решить такую проблему в couchdb?
Заранее спасибо.
1 ответ
Вам необходимо создать индекс для каждого столбца, по которому вы хотите выполнить запрос, и выполнить логическую операцию на стороне клиента.
В вашем случае я бы предложил создать следующий вид:
function(doc) {
emit(['by_timestamp', doc.timestamp], null);
emit(['by_value', doc.value], null);
}
Теперь запросите ваш вид со следующими параметрами:
?startkey=['by_timestamp', X]&endkey=['by_timestamp', Y]
?startkey=['by_value', Z]&endkey=['by_value', {}]
Получив результаты, на стороне клиента выполняем заданное пересечение идентификаторов документов, возвращаемых обоими запросами.
Получив его, вы получите результаты с помощью запроса POST /dbname/_all_docs?include_docs=true
Внутри почтового тела вставьте jsoned dict:
{keys: [...]}
И альт.
Примечание: в качестве альтернативы вы можете рассмотреть возможность использования отдельной функции map() для каждого индекса. Таким образом вы увеличиваете скорость запроса за счет более медленной индексации новых / обновленных документов.