2011-01-13 1 views
5

У меня есть мнение CouchDB «record_by_date_product» со следующим определением:Как запросить представление couchdb с помощью сложного ключа?

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

Я пытаюсь выполнить запрос, который что-то вроде:

(logtime > fromdate & logtime < todate) & product_id in (1,2,6) 

Возможно ли это с этой точки зрения?

Я также использую библиотеку 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 указывает, что мы можем использовать Клавишапуска и EndKey. Но я не могу заставить его работать.

Спасибо

ответ

5

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

Дизайн вид '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 изменяется во втором запросе. Результаты должны быть собраны позже. Надеюсь это поможет!

+1

Ты только один человек, не так ли? Вы просто ответили на свой вопрос и сказали: «Надеюсь, это поможет». Во всяком случае, это не сработает, потому что порядок ключей неверен. Диапазон между '[start_date, 1]' и '[end_date, 1]' будет включать в себя много вещей, которые вы не хотите, как и все в диапазоне дат для id = 2 продукта. Это * будет * работать, если вы выбрали идентификатор продукта до даты. –

+0

Хехэ! Я думал, что это тоже поможет другим! :) Вы правы, мне придется отменить порядок ключей, а затем запросить представление. Позвольте мне внести изменения в решение. Благодаря! –

3

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

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

-1

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

  1. создать представление для каждого продукта с logtime в качестве индекса.
  2. Доступ каждый вид при необходимости и фильтровать theresults, используя диапазон - [FromDate Todate]
  3. ли 3 для каждого продукта входных параметров и сверяют результаты

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

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

+0

Это может быть проще.Просто измените порядок клавиш, чтобы документы сортировались сначала по продукту, а затем по журналу. Запросите один и тот же взгляд три раза, ищите каждый продукт в нужном вам временном диапазоне. Это второе предложение в ответе, который я отправил, поэтому, если вам нравится, отметьте его как принятый :) –

+0

Привет, Как мне «искать каждый продукт во временном диапазоне»? Я думаю, что это именно тот вопрос, который я задал. Дело в том, что мы можем отправить в представление только дату или диапазон [startdate enddate]. Но мы не можем одновременно отправлять и диапазон, и идентификатор продукта. Я рассматриваю использование списков, которые принимают любое количество параметров запроса. Дает обновление. Благодаря! –

+0

Вы можете искать диапазон и идентификатор продукта одновременно. Представления CouchDB могут использовать составные ключи, и вы приводили пример того, как его построить. Все, что вам нужно сделать, - это изменить порядок вашего ключа, чтобы он «[doc.product_id, doc.logtime]». Чтобы запросить его, используйте ключи запуска и конечные ключи в том же формате двух элементов, что и в документации, к которой вы привязались. –

Смежные вопросы