Поддерживает ли CouchDB запросы с несколькими диапазонами? - PullRequest
5 голосов
/ 24 июня 2009

Как в CouchDB реализованы запросы с несколькими диапазонами? Для условия с одним диапазоном комбинация начальных и конечных ключей работает нормально, но то же самое не работает с условием с несколькими диапазонами.

Функция My View выглядит следующим образом:

"function(doc){
       if ((doc['couchrest-type'] == 'Item') 
    && doc['loan_name']&& doc['loan_period']&&    
                      doc['loan_amount']) 
     {  emit([doc['template_id'],
          doc['loan_name'],doc['loan_period'],
           doc['loan_amount']],null);}}"

Мне нужно получить целые документы с loan_period> 5 и loan_amount> 30000. Мои параметры startkey и endkey такие:

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000],
  :endkey=>["7446567e45dc5155353736cb3d6041c0",{},{},{}],:include_docs => true}  

Здесь я не получаю желаемого результата. Я думаю, что мои параметры startkey и endkey неверны. Кто-нибудь может мне помочь?

Ответы [ 4 ]

4 голосов
/ 26 июня 2009

Представление CouchDB - это упорядоченный список записей. Запросы к представлению возвращают непрерывный фрагмент этого списка. Таким образом, невозможно применить два условия неравенства.

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

Альтернативным решением будет использование couchdb-lucene.

1 голос
/ 01 августа 2009

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

например. для сравнения [1,'a',5] и [1,'c',0] он сравнивает 1 с 1, затем «a» с «c» и решает, что [1, 'a', 5] меньше [1, 'a', 0]

Это объясняет, почему ваш запрос ключа диапазона терпит неудачу:

["7446567e45dc5155353736cb3d6041c0",nil,5,30000] больше ["7446567e45dc5155353736cb3d6041c0",nil,5,90000]

0 голосов
/ 29 июля 2009

На самом деле CouchDB позволяет представлениям иметь сложные ключи, которые являются массивами значений, как указано в вопросе:

[template_id, loan_name, loan_period, loan_amount]

Вы пробовали

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000],
  :endkey=>["7446567e45dc5155353736cb3d6041c0",{}],:include_docs => true}

или, возможно,

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0","\u0000",5,30000],
  :endkey=>["7446567e45dc5155353736cb3d6041c0","\u9999",{}],:include_docs => true}
0 голосов
/ 24 июня 2009

Ваше заявление об эмиссии выглядит немного странно для меня. Цель emit - создать ключ (то есть индекс), а затем интересующие вас значения документа.

например:

emit( doc.index, [doc.name, doc.address, ....] );

Вы генерируете массив для индекса и нет данных для представления.

Кроме того, Couchdb не обеспечивает пересечение видов, поскольку не очень хорошо вписывается в карту / сокращает парадигму. Таким образом, ваши потребности сводятся к попыткам решить следующие вопросы:

Могу ли я создать уникальный индекс, из которого я могу затем извлечь определенный диапазон? (используя startkey & endkey)

...