Как запросить представление couchdb, используя составной ключ? - PullRequest
5 голосов
/ 13 января 2011

У меня есть представление couchdb "record_by_date_product" со следующим определением:

function(doc) {
  emit([doc.logtime, doc.product_id], doc);
}

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

Я также использую библиотеку Python couchdb для доступа к couchdb.Вот фрагмент кода:

server = couchdb.Server()
db = server['mydb']

results = db.view('_design/record_by_date_product/_view/record_by_date_product')

Эта страница http://packages.python.org/CouchDB/client.html#viewresults указывает, что мы можем использовать начальную и конечную клавиши.Но я не могу заставить его работать.

Спасибо

Ответы [ 3 ]

5 голосов
/ 14 января 2011

Я думаю, что только что нашел точный ответ:

Создайте представление 'sampleview', которое выглядит так:

{
   "records_by_date_product": {
       "map": "function(doc) {\n  emit([doc.prod_id, doc.logtime], doc);\n}"
   }
}

Допустим, параметры запроса:

prod_id in [1,3]
from_date = '2010-01-01 00:00:00'
to_date = '2010-01-02 00:00:00'

Затем вам нужно будет выполнить 2 отдельных запроса в одном представлении:

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\["1,2010-01-01%2000:00:00"\]'&endkey='\[1,"2010-01-02%2000:00:00"\]'

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\[2,"2010-01-01%2000:00:00"\]'&endkey='\[2,"2010-01-02%2000:00:00"\]'

Обратите внимание, что один и тот же запрос выполняется каждый раз, за ​​исключением того, что prod_id изменяется во втором запросе. Результаты должны быть сопоставлены позже. Надеюсь, это поможет!

3 голосов
/ 13 января 2011

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

Стратегия, которую вы должны использовать для этого запроса, зависит от характеристик самих данных. Самое главное, будете ли вы тратить много времени на отсеивание элементов, если будете использовать только первую часть ключа (logtime) и перебирать те, что в Python, отсеивая элементы, для которых product_id не будет совпадать? Если это так, вам следует рассмотреть возможность написания другого представления, которое в первую очередь отсортировано по product_id. Если нет, продолжайте и используйте подход отсеивания.

0 голосов
/ 14 января 2011

Как насчет этого решения:

  1. Я создаю представление для каждого продукта с временем журнала в качестве индекса.
  2. Доступ к каждому представлению при необходимости и фильтрация результатов с использованием диапазона - [fromdate todate]
  3. Do 3 для каждого продукта во входных параметрах и сопоставление результатов

Это имеет недостаток, заключающийся в том, что для каждого продукта нам нужно создать представление, и это выглядит как ручной процесс.

Просто мысль! Дайте мне знать ваши взгляды.

...