2015-09-25 2 views
2

Я использую couchbase 3.0.1 Community Edition (build-1444). У меня есть документы с датой и массив тегов:Couchbase View: получить документы по ключам, отсортировано

{ 
    // ... 
    date_start: '2015-09-25', 
    tags: ['tag1', 'tag2'], 
    // ... 
} 

Я создал представление, чтобы соответствовать этим документам по тэгам:

function (doc, meta) { 
    // some tests to be sure the doc is alright 
    // ... 
    for (var i = 0, i < doc.tags.length; i += 1) { 
     emit(doc.tags[i], null); 
    } 
} 

При создании запроса для выборки тегов по клавишам, все в порядке , Но теперь, каков наилучший способ отсортировать это по дате_start потомкам?

я видел в доке (http://docs.couchbase.com/admin/admin/Views/views-querying.html), что:

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

Что делать, если я все еще хочу сортировать?

----- EDIT -----

Я использую предел для извлечения только последние пять документов с этими метками. И в этом суть: этот предел должен извлекать документы по тегам, но с датой заказа.

Благодаря

+0

Нужно ли отсортировать результаты запроса тегов? Или просто все документы, отсортированные по 'date_start'? – joewright

+0

Просто все документы (которые соответствуют запросу 'tags') отсортированы по' date_start'. – rekam

+0

Не должно ли название вопроса получать документы по * тегам *, отсортировано? –

ответ

0

Я не думаю, что есть простой способ получить то, что вы хотите, но вы могли бы сделать следующее:

  1. Очевидно, что вы можете использовать несколько запросов, а затем пересекаются ваши результаты в код. Это не так плохо, как кажется: точность запроса уже ограничена «возможной согласованностью», поэтому ваши результаты неточно начинаются с.

  2. Еще одна вещь, которую вы можете сделать - с помощью единого запроса - испускать как теги, так и дату и (снова) сортировать результаты в вашем коде.

  3. наконец, возможно, это может быть сделано в NIQL - но это будет только готовый к производству в Couchbase 4.

+0

Спасибо за ваш вклад! Поскольку мои данные сейчас не такие большие, я выбрал второе предложение. Может быть, не лучшая оптимизация для моего дела, но он может сделать работу – rekam

0

Couchbase просматривать результаты всегда будут упорядочены по ключу так, чтобы достичь вашего запроса вы должны имеют часть ключа date_start.

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

function (doc, meta) { 
    for (var i = 0; i < doc.tags.length; i += 1) { 
     emit(doc.tags[i] + "::" + doc.date_start, docData); 
    } 
} 

и запросить мнение по ключевому диапазону (tag + "::" + current_time, tag + "::" + the_beginning_of_time). docData - это подмножество данных документа, которое необходимо отобразить в результатах поиска (название, теги, ...).

Чтобы иметь возможность сопоставлять документы с несколькими тегами, трюк должен был испускать все возможные комбинации тегов (т.е.the power set):

function (doc, meta) { 
    var combinations = getSortedPowerSet(doc.tags) 
    for (var i = 0; i < combinations.length; i += 1) { 
     emit(combinations[i].join("::") + "::" + doc.date_start, docData); 
    } 
} 

и запросов от ключевого диапазона, начиная с tags.sort().join("::") + "::" + current_time. (Обратите внимание, что, когда tags пуст он должен вернуть самый последний документ, как и ожидалось.)

Powerset является easy to compute in python, это, вероятно, не слишком сложно в Node.js, вам просто нужно будет обеспечивать максимальное количество тегов n на каждый документ, учитывая, что размер набора мощности растет экспоненциально на уровне 2^n.

+0

Спасибо за это! В конце концов, я упростил этот процесс. Прямо сейчас, это не проблема для меня, чтобы получить все документы и сделать forEach на них, чтобы фильтровать и сортировать все. Этого должно быть достаточно для моего дела за эти два или более года (эти данные не растут так быстро). Я держу свой ответ в своем уме, поэтому я могу придумать что-то, когда это необходимо – rekam

+0

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

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