Статьи

Couchbase: понимание group_level в View Queries

Примечание куратора: содержание этой статьи первоначально было написано Джасдипом Джайтлой в блоге Couchbase.

Запросы Представления — это то, что представляют собой представления. Наша документация великолепна и может быть найдена здесь:  http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views.html

Составные ключи

Просто чтобы проиллюстрировать, как работает уровень группы, давайте используем функцию Map, которая сортирует пользователей по последней отметке времени входа в систему, преобразовывая эту отметку времени в массив [ггггг, мм, дд, чч, мм, сс] ​​в то, что мы называем «составным ключом». (или клавиша Array) в качестве вывода функции Map:

Функция карты
function(doc, meta) {
    if (doc.login_timestamp) {
        emit(dateToArray(doc.login_timestamp), doc.username);
    }
}
Уменьшить функцию

_count

Результирующие строки (с уменьшением = ложь)
[2011,10,10,10,10,09] "scalabl3"
[2012,12,24,17,03,59] "scalabl3"
[2013,01,01,08,22,23] "scalabl3"
[2013,01,25,10,38,01] "tgrall"
[2013,01,25,11,02,32] "jzablocki"
[2013,02,01,11,02,32] "scalabl3"

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

["2011","10","10","10","10","09"] "scalabl3"
["2012","12","24","17","03","59"] "scalabl3"
["2013","01","01","08","22","23"] "scalabl3"
["2013","01","25","10","38","01"] "tgrall"
["2013","01","25","11","02","32"] "jzablocki"
["2013","02","01","11","02","32"] "scalabl3"

Быстрый иллюстративный контрпример для заказа ключей

Если у вас был следующий вывод Map, обратите внимание, что он отсортирован не так, как если бы параметры Int были на самом деле Int, фактически индексные ключи всегда являются строками.

[2012,"beer",1] null
[2012,"beer",10] null
[2012,"beer",2] null

Обратите внимание, что второй «элемент» индексного ключа упорядочен до 3-го числа из-за сравнения строк, это не целые числа. Вернуться к запланированной программе …

Продолжая с уровня группы …

Итак, теперь, возвращаясь к списку login_timestamps в представлении выше, если мы хотим увидеть, сколько людей вошли в систему в течение каждого года, я добавляю параметр запроса «group_level = 1», и он разбивает строку на первую запятую и группирует оставляют элементы вместе с помощью совпадения строк, а затем сокращают группу, производя счет.

["2011"] 1
["2012"] 1
["2013"] 4

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

["2011","10"] 1
["2012","12"] 1
["2013","01"] 3
["2013","02"] 1

Переход к следующему group_level, group_level = 3, сгруппирует по (yyyy, MM, dd), который является третьим элементом составного ключа, он разделяется на 3-ю запятую, группирует левый элемент и уменьшает:

["2011","10","10"] 1
["2012","12","24"] 1
["2013","01","01"] 1
["2013","01","25"] 2
["2013","02","01"] 1

В этом крошечном наборе данных, если мы перейдем к group_level = 4, который в данном случае равен часу (гггг, мм, дд, чч), каждый элемент является собственным результатом строки с возможностью группировки и сокращения, поскольку все они уникальны , В большем и более часто обновляемом наборе данных вы, вероятно, можете группировать по минутам и видеть более высокие числа _count:

["2011","10","10","10"] 1
["2012","12","24","17"] 1
["2013","01","01","08"] 1
["2013","01","25","10"] 1
["2013","01","25","11"] 1
["2013","02","01","11"] 1

Понимание составных ключей

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

function (doc, meta) {
  if (doc.year && doc.type == "beer" && doc.int_value) {
    var val = doc.int_value.toString();
    var max ="000000000";
    var pval = max.substring(0, max.length - val.length) + val;
    emit([doc.year, doc.type, pval], null);
  }
}
Результирующие строки (с уменьшением = ложь)
[2012,"beer","000000001"] 1
[2012,"beer","000000002"] 1
[2012,"beer","000000010"] 1

Конечно, вы можете поместить что угодно в массив, не только dateToArray! Это полезная тактика для возможности группировать предметы вместе для сокращения. Последнее, что следует помнить, это то, что если вы дополняете нулями, то это строки, поэтому, если вы хотите выполнить запрос диапазона на получающейся индексной клавише, вы также должны дополнить этот диапазон нулями, если вы ищете определенный диапазон, для пример:

startkey=[2012,"beer","000000002"]
&endkey=[2012,"beer","000000007"]

Понимание Unicode Collation

Для получения дополнительной информации о порядке следования строковых символов, пожалуйста, прочитайте мой пост о сопоставлении Юникода в представлениях, так как он не в байтовом порядке и применяется также к составным ключам: Понимание порядка букв в запросах представления