2015-08-18 3 views
2

Я новичок в CouchDb. Мне нужно фильтровать записи по дате (дата должна быть между двумя значениями) и сортировать данные по имени или дате и т. Д. (Это зависит от выбора пользователя в таблице). В MySQL это выглядит какCouchDb фильтр и сортировать в одном виде

SELECT * FROM table WHERE date > "2015-01-01" AND date < "2015-08-01" ORDER BY name/date/email ASC/DESC 

Я не могу понять, если я могу использовать одно представление для всех этих вопросов. Вот моя карта пример:

function(doc) { 
    emit(
     [doc.date, doc.name, doc.email], 
     { 
      email:doc.email, 
      name:doc.name, 
      date:doc.date, 
     } 
    ); 
} 

Я пытаюсь фильтровать данные с помощью Клавишапуска и EndKey, но я не уверен, как сортировать данные в этом случае:

startkey=["2015-01-01"]&endkey=["2015-08-01"] 

Могу ли я использовать один вид ? Или мне нужно создать некоторые представления с порядком клавиш в зависимости от моего текущего поля заказа: [doc.date, doc.name, doc.email], [doc.name, doc.date, doc.email] и т. Д.?

Благодарим за помощь!

ответ

1

Как Себастьян сказал вам необходимо использовать функцию списка, чтобы сделать это в Couch.

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

В Couch вид - ваш индекс B-дерева, а функция списка может реализовать любую логику, в которой вы нуждаетесь. Его можно использовать для выталкивания HTML вместо JSON, но его также можно использовать для фильтрации/сортировки вывода вашего представления и до конца выплюнуть JSON. Это может не очень хорошо масштабироваться для миллионов документов, но MySQL может и не быть.

Так что ваши варианты являются те, Себастьян выделены:

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

  2. просмотров сортировать по электронной почте/etc, функция списка фильтрует все вне диапазона дат.

Какой из них выбрать, зависит от ваших данных и архитектуры.

С помощью опции 1 вы можете полностью исключить функцию списка: получить все необходимые данные из представления за один раз (с include_docs) и отсортировать клиентскую сторону. Вот как вы обычно используете Couch.

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

Вариант 2 сканирует предварительно заказанные документы и отправляет только те, которые соответствуют датам. Сделано правильно, это позволяет не загружать все в память. OTOH может сканировать слишком много документов, уничтожая ваш диск IO.

Если диапазон дат «очень различен» (несколько документов проходят тест), вариант 1 работает лучше всего; в противном случае (большинство документов проходит) вариант 2 может быть лучше. Помните, что в то время, когда требуется загрузить бесполезный документ с диска (вариант 2), вы можете сортировать десятки документов в памяти, если они поместились в памяти (вариант 1). Кроме того, чем больше индексов, тем больше дискового пространства используется, и чем больше записей замедляется.

+0

Спасибо за отличное объяснение для меня! – Elena

1

Вы можете использовать функцию списка для этого, двух способов:

1.) Диван-View упорядочен по датам и сортировка по электронному амилу => но пожалуйста. имейте в виду, что вам придется иметь ВСЕ элементы в памяти, чтобы сделать этот вид по электронной почте (т. е. вы можете сделать это, только если ваш результирующий набор невелик)

2.) Couch-View заказывается по e- почты и функция список капель все вне диапазона дат (вы можете сделать только, что, когда общий список мал - так это один наиболее вероятно, плохо)

возможно # 1 может помочь вам

+0

Спасибо за ваш ответ! – Elena

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