2017-01-11 4 views
0

Я новичок в couchdb, я просмотрел документы и сообщения SO, но по какой-то причине этот простой запрос все еще ускользает от меня.Query Couchdb по дате при сохранении порядка сортировки

SELECT TOP 10 * FROM x WHERE DATE BETWEEN startdate AND enddate ORDER BY score 

UPDATE: Это не может быть сделано. Это печально, так как для получения этого типа данных вы должны оттянуть потенциально миллионы записей (несколько полей ) с кушетки, тогда сделайте либо фильтрацию, сортировку или ограничение самостоятельно, чтобы получить желаемые результаты. Теперь я возвращаюсь к своему оригинальному решению с использованием _changes для сбора и хранения в других местах данных, которые мне нужны для выполнения этого запроса.

Вот мои обновленные вид (благодаря Доминику):

emit([d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score], doc.name); 

Что мне нужно сделать, это:

  • Всегда сортировать по баллам по убыванию
  • Необязательно фильтр (например, только СЕГОДНЯ)
  • Предел по x

Обновление: Спасибо Доминику я гораздо ближе - но все еще имеющий вопрос.

?startkey=[2017,1,13,{}]&endkey=[2017,1,10]&descending=true&limit=10&include_docs=true 

Это возвращает документы между датами, отсортированных по баллам

Однако, если я хочу, топ-10, независимо от даты, то я только получить обратно 10 лучших отсортированные по дате (а не оценка)

ответ

2

Для начала, при использовании сложных клавиш в CouchDB, вы можете только сортировать слева направо. Это распространенное заблуждение, но прочитайте на Views Collation для более подробного объяснения. (В то время как вы на него, читать весь Guide to Views, а так как вы знакомитесь)

Если вы хотите, чтобы иметь возможность сортировать по баллам, но фильтр даты только, вы можете сделать это, разбив вниз, чтобы показать только то, что вам нужно.

function (doc) { 
    var d = new Date(doc.date) 
    emit([ d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score ]) 
} 

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

startkey=[2017,1,1]&endkey=[2017,1,1,{}] 

Это будет забрать все документы на 1-1-2017 , и он будет отсортирован по счету уже! (В порядке возрастания, просто поменять местами startkey и endkey получить убывающий порядок, никаких изменений в представление необходимого)

как в стороне, не избежать излучающего весь doc в качестве значения в вашем представлении. Вероятнее всего, более эффективно использовать параметр include_docs=true и оставить значение вашего источника пустым.(см. this SO question для получения дополнительной информации)

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

Однако, если вы готовы или сможете сортировать свои оценки в своем приложении, вы можете использовать один вид, чтобы получить всю необходимую точность даты. Например:

function (doc) { 
    var d = new Date(doc.date) 
    emit([ d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHour(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds() ]) 
} 

С этой точки зрения и параметра group_level, вы можете получить все баллы в год, месяц, дата, час, и т.д. Как я уже говорил, в этом случае она не будет отсортирован по баллам но, возможно, это откроет вам другие вопросы. (например: какие пользователи участвовали в этом месяце?)

+0

Отлично, спасибо Доминик, я собираюсь попробовать это сейчас. Я фактически не хранил документ, но только что создал подмножество документа (с 8 реквизитами) (то есть: {Name: doc.prop.name, ...} - было бы еще более эффективно использовать include_docs = true (и view = emit ([keys], 1), когда у doc есть около 50 свойств? Я могу измерить, но звучит так, как вы узнали бы с головы :-) – schmoopy

+0

Я также обновил свой вопрос, узнав, что предел действительно может повлиять на вещи - но ваше решение отлично работает для всех нужд - спасибо огромное! – schmoopy

+0

Я слишком скоро говорил. Если я добавляю лимит, то он не работает правильно из-за сортировки влево-вправо. Я обновил свой вопрос (и отредактировал мой комментарий на 100-й раз, извините за все обновления) – schmoopy