#date #view #couchdb
#Дата #Вид #couchdb
Вопрос:
У меня есть следующее представление в couchdb, которое будет возвращать документы только с датой, превышающей текущую дату, например:
function (doc) {
var eventDay = new Date(new Date(doc.start).toDateString()),
currentDay = new Date(new Date().toDateString());
if (eventDay > currentDay) {
emit();
}
}
Таким образом, в этом случае представление всегда будет показывать только будущие (предстоящие) события. У меня также есть тот же перевернутый вид, чтобы показывать только прошлые события. Но проблема в том, что, по-видимому, представление не обновляется на следующий день. Поэтому мне приходится обновлять представление вручную, добавляя несколько разрывов строк, и поэтому я предполагаю, что это вызывает «обновление’.
Есть идеи о том, как я мог бы заставить это работать?
Большое спасибо
Ответ №1:
Не забывайте, что код карты для каждой записи выполняется при создании / изменении документа, поэтому у вас не будет согласованных значений для того, что вы считаете «текущим днем».
Вместо этого вы должны создать представление, которое позволяет добавлять эту информацию во время запроса. Вот пример:
funciton(doc){
//Extract from date object.
var year = ..;
var month = ..;
var day = ..;
//..
emit([year,month,day], null);
}
Это создаст сложный индекс, упорядоченный по (год, месяц, день). Теперь вы можете запрашивать частичные диапазоны, например, все даты в будущем, используя startkey / endkey . Пожалуйста, ознакомьтесь с API просмотра для получения подробной информации: http://wiki.apache.org/couchdb/HTTP_view_API
Комментарии:
1. большое спасибо за это PartlyCloudy. Итак, вы имели в виду, что представления не будут обновляться до тех пор, пока документ не будет создан или обновлен? следовательно, необходимо запрашивать ключи start и end, поскольку эти значения будут отличаться каждый день, а затем выводить согласованные результаты?
2. Подумайте об индексе представления как о отсортированном списке, который будет обновляться постепенно при изменениях — будут вставлены новые документы, измененные документы будут вставлены повторно. Ваш атрибут «текущий день» — это то, что вам нужно во время вашего запроса, а не при создании представления. В двух словах, у вас будет длинный отсортированный список документов (по дате) и частичные диапазоны запросов с использованием startkeys и endkeys.
3. 1. Верно, представления — это способ построения полностью статического индекса исходных данных. Индекс может постепенно обновляться по мере изменения документов, но по большей части он остается неподвижным. Когда вы запрашиваете представление, CouchDB всегда сканирует индекс. Это быстро и предсказуемо. Единственный элемент управления, который у вас есть, — это
startkey
иendkey
для каждого запроса.4. функция @b_erb в вашем ответе написана с ошибкой как функция.