Команда ReQL: order_by
Синтаксис команды
table.order_by([key | function], :index => index_name) → table_slice selection.order_by(key | function[, ...]) → selection<array> sequence.order_by(key | function[, ...]) → array
Описание
Сортирует последовательность по значениям документов заданного ключа (ключам). Для указания порядка используйте r.asc или r.desc (по умолчанию — возрастающий порядок).
Примечание: RethinkDB использует байтовое упорядочение для orderBy и не поддерживает сортировку Unicode; не-ASCII символы будут отсортированы по кодовым точкам UTF-8. Для получения дополнительной информации о порядке сортировки в RethinkDB, обратитесь к разделу в типах данных ReQL.
Сортировка без индекса требует, чтобы сервер хранил последовательность в памяти и ограничена 100 000 документами (или значением опции array_limit для run). Сортировка с индексом может выполняться на произвольно больших таблицах или после команды between с использованием того же индекса. Это относится как к вторичным индексам, так и к первичному ключу (например, :index => 'id').
Функции сортировки, переданные в order_by , должны быть детерминированными. Например, нельзя сортировать строки с помощью команды random. Использование недетерминированной функции с order_by приведет к ошибке ReqlQueryLogicError.
Пример: Отсортировать все записи, используя индекс date.
r.table('posts').order_by(:index => 'date').run(conn)
Индекс должен быть либо первичным ключом, либо созданным ранее с помощью index_create.
r.table('posts').index_create('date').run(conn)
Также можно выбрать убывающий порядок:
r.table('posts').order_by(:index => r.desc('date')).run(conn, callback)
Пример: Сортировка последовательности без индекса.
r.table('posts').get(1)['comments'].order_by('date')
Также можно выбрать убывающий порядок:
r.table('posts').get(1)['comments'].order_by(r.desc('date'))
Если вы выполняете аналитику "на ходу" и знаете, что ваша таблица будет содержать не более 100 000 элементов (или вы изменили значение опции array_limit для run), вы можете запустить order_by без индекса:
r.table('small_table').order_by('date')
Пример: Вы можете эффективно сортировать по нескольким полям, используя составной индекс.
Сортировка по дате и заголовку.
r.table('posts').order_by(:index => 'date_and_title').run(conn)
Индекс должен быть либо первичным ключом, либо созданным ранее с помощью index_create.
r.table('posts').index_create('date_and_title') {|post| [post["date"], post["title"]]}.run(conn)
Примечание: Нельзя задавать несколько порядков в составном индексе. Следите за прогрессом в задаче #2306.
Пример: Если у вас есть последовательность с количеством документов меньше array_limit, вы можете отсортировать её по нескольким полям без индекса.
r.table('small_table').order_by('date', r.desc('title'))
Пример: Обратите внимание, что порядок индекса всегда имеет наивысший приоритет. Следующий запрос сортирует записи по дате, а если несколько записей опубликованы в один и тот же день, они сортируются по заголовку.
r.table('post').order_by(:title, :index => 'date').run(conn)
Пример: Вы можете использовать синтаксис вложенного поля для сортировки по полям из вложенных документов. (Вы также можете создать индексы на вложенных полях, используя этот синтаксис с помощью index_create).
r.table('user').order_by{ |user| user['group']['id'] }.run(conn)
Пример: Вы можете эффективно сортировать данные по произвольным выражениям с помощью индексов.
r.table('posts').order_by(:index => 'votes').run(conn)
Индекс должен быть создан ранее с помощью index_create.
r.table('posts').index_create('votes') {|post|
post["upvotes"]-post["downvotes"]
}.run(conn)
Пример: Если у вас есть последовательность с количеством документов меньше array_limit, вы можете отсортировать её с произвольной функцией напрямую.
r.table('small_table').order_by(lambda { |doc|
doc['upvotes']-doc['downvotes']
});
Также можно выбрать убывающий порядок:
r.table('small_table').order_by(r.desc(lambda { |doc|
doc['upvotes']-doc['downvotes']
}));
Пример: Сортировка после команды between может быть выполнена, если используется тот же индекс.
r.table("posts").between(r.time(2013, 1, 1, '+00:00'), r.time(2013, 1, 1, '+00:00'), :index => 'date')
.order_by(:index => 'date').run(conn);
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/order_by/