2013-07-31 4 views
0

У меня проблема с представлениями в Couch DB (все версии 1.01 - 1.31).Расширенный дневной запрос с CouchDB

Мои данные выглядит следующим образом:

{ 
    "_id": "9a12b7fa4b886640be06f74b814306a6", 
    "_rev": "1-420c723f8c8f7921ead3df04bfc9ade5", 
    "client_id": "008", 
    "day": 1, 
    "month": 1, 
    "year": 2013, 
    "comment": "cool" 
} 

И я хочу видеть все операции, которые клиент сделал в промежуток времени, позволяет сказать, что 1 месяц:

поэтому моя функция карта, как:

function(doc) { 
    emit([doc.client_id, doc.day,doc.month, doc.year], doc); 
} 

Так я запрос с Клавишапуска и EndKey как

http://localhost:5984/test/_design/clients/_view/by_cid_day_month_year?startkey=[%22007%22,1,1,2013]&endkey=[%22007%22,32,1,2013] 

Но вместо того, чтобы получать все документы с января с помощью client_id = 007, я получаю все записи, соответствующие 007.

Так что должно быть что-то, что я недопонимаю. Что не так с моим запросом? Как это должно выглядеть?

Мое мышление состоит в том, что я мог бы также просто просматривать журналы с определенной даты или от 1-го янва до 6-го ян.

Я попытался сделать ключи за день, месяц и год в виде строк, но результат всегда один и тот же, или даже иногда странный, как в приведенном выше примере, я найду запись в сентябре (9), но если я пойду в апреле f.ex. Я получаю все записи.

Я этого не понимаю. Это должно быть довольно прямолинейным.

+1

Не моя сильная свита, но не должны вы 'испускают ([doc.client_id, doc.year, doc.month, doc.day], док);' (т.е. наиболее значимым первым), чтобы сделать сравнительная работа? –

+0

Не имеет значения –

+1

Нечетные, с оригиналом, все дни между 1 и 32, поэтому они должны быть включены, прежде чем им придется возвращаться в месяц (т.е. все дни между 1 и 32, независимо от того, какой месяц будет включен, так что все, что соответствует 007). С новым испусканием я не вижу, как это произойдет. –

ответ

2

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

Если вы вместо этого;

emit([doc.client_id, doc.year, doc.month, doc.day], doc); 

сравнение сначала проверит год, затем месяц и последнюю дату, что вы хотите сделать.

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

...by_cid_year_month_day?startkey=[%22007%22,2013,1]&endkey=[%22007%22,2013,1,{}] 

... после ухода последнего элемента из делает массив сортировки перед любым массивом, который больше (любая дата), и {} будет сортировать после любой даты. Таким образом, поиск всего 2013 года будет таким же образом;

...by_cid_year_month_day?startkey=[%22007%22,2013]&endkey=[%22007%22,2013, {}] 
+0

Спасибо. Пустая хэш-вещь очень полезна –

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