Spec-Zone.ru › RethinkDB javascript

Команда ReQL: orderBy

Синтаксис команды

table.orderBy([key | function...], {index: index_name}) → table_slice
selection.orderBy(key | function[, ...]) → selection<array>
sequence.orderBy(key | function[, ...]) → array

Описание

Сортирует последовательность по значениям документов заданного ключа (или ключей). Для задания порядка используйте r.asc или r.desc (по умолчанию — по возрастанию).

Примечание: RethinkDB использует байтовый порядок для orderBy и не поддерживает сортировку по Unicode; символы, не являющиеся ASCII, будут отсортированы по кодовым точкам UTF-8. Для получения дополнительной информации об порядке сортировки в RethinkDB см. раздел в типах данных ReQL.

Сортировка без индекса требует, чтобы сервер хранил последовательность в памяти, и ограничена 100 000 документами (или значением параметра arrayLimit для команды run). Сортировка с индексом может быть выполнена для произвольно больших таблиц или после команды between с использованием того же индекса. Это относится как к вторичным индексам, так и к первичному ключу (например, {index: 'id'}).

Функции сортировки, передаваемые в orderBy , должны быть детерминированными. Например, нельзя отсортировать строки с помощью команды random. Использование недетерминированной функции с orderBy вызовет ReqlQueryLogicError.

Пример: Сортировка всех постов с использованием индекса date.

r.table('posts').orderBy({index: 'date'}).run(conn, callback);

Индекс должен быть либо первичным ключом, либо был создан ранее с помощью indexCreate.

r.table('posts').indexCreate('date').run(conn, callback);

Также можно выбрать убывающий порядок:

r.table('posts').orderBy({index: r.desc('date')}).run(conn, callback);

Пример: Сортировка последовательности без индекса.

r.table('posts').get(1)('comments').orderBy('date').run(conn, callback);

Также можно выбрать убывающий порядок:

r.table('posts').get(1)('comments').orderBy(r.desc('date')).run(conn, callback);

Если вы выполняете аналитику «на лету» и знаете, что ваша таблица будет содержать не более 100 000 элементов (или вы изменили значение параметра array_limit для команды run), вы можете выполнить orderBy без индекса:

r.table('small_table').orderBy('date').run(conn, callback);

Пример: Эффективная сортировка по нескольким полям возможна с помощью составного индекса.

Сортировка по дате и заголовку.

r.table('posts').orderBy({index: 'dateAndTitle'}).run(conn, callback);

Индекс должен быть либо первичным ключом, либо был создан ранее с помощью indexCreate.

r.table('posts').indexCreate('dateAndTitle', [r.row('date'), r.row('title')]).run(conn, callback);

Примечание: Нельзя указать несколько порядков в составном индексе. Следите за прогрессом в задаче #2306.

Пример: Если у вас есть последовательность с количеством документов меньше, чем arrayLimit, вы можете отсортировать её по нескольким полям без индекса.

r.table('small_table').orderBy('date', r.desc('title')).run(conn, callback);

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

r.table('post').orderBy('title', {index: 'date'}).run(conn, callback);

Пример: Используйте синтаксис вложенного поля для сортировки по полям из вложенных документов. (Вы также можете создать индексы по вложенным полям с использованием этого синтаксиса с indexCreate.)

r.table('user').orderBy(r.row('group')('id')).run(conn, callback);

Пример: Эффективная сортировка данных по произвольным выражениям с использованием индексов.

r.table('posts').orderBy({index: 'votes'}).run(conn, callback);

Индекс должен быть создан ранее с помощью indexCreate.

r.table('posts').indexCreate('votes', function(post) {
    return post('upvotes').sub(post('downvotes'))
}).run(conn, callback);

Пример: Если у вас есть последовательность с количеством документов меньше, чем arrayLimit, вы можете отсортировать её произвольной функцией напрямую.

r.table('small_table').orderBy(function(doc) {
    return doc('upvotes').sub(doc('downvotes'))
}).run(conn, callback);

Также можно выбрать убывающий порядок:

r.table('small_table').orderBy(r.desc(function(doc) {
    return doc('upvotes').sub(doc('downvotes'))
})).run(conn, callback);

Пример: Сортировка после команды between может быть выполнена, если используется тот же индекс.

r.table('posts').between(r.time(2013, 1, 1, '+00:00'), r.time(2013, 1, 1, '+00:00'), {index: 'date'})
    .orderBy({index: 'date'}).run(conn, callback);

Связанные команды

  • skip
  • limit
  • slice

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/javascript/order_by/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API