Команда 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);
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/javascript/order_by/