Spec-Zone.ru › RethinkDB ruby

Команда 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);

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

  • skip
  • limit
  • []

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

Spec-Zone.ru

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