CouchDB Где соединение

Я застрял со следующей проблемой в couchdb. Представьте себе следующую документацию

{Имя:"тест", метка времени:12334567, стоимость:335}

Моя задача состоит в том, чтобы запросить все документы на конкретном таймфрейме, которые имеют значение больше X. В SQL это будет что-то вроде

SELECT * FROM doc, где отметка времени>=X и отметка времени Z

Значение 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() для каждого индекса. Таким образом вы увеличиваете скорость запроса за счет более медленной индексации новых / обновленных документов.

Другие вопросы по тегам