Spec-Zone.ru › RethinkDB java

Команда ReQL: orderBy

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

table.orderBy([key | function]).optArg("index", index) → selection<stream>
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().optArg("index", "date").run(conn);

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

r.table("posts").indexCreate("date").run(conn);

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

r.table("posts").orderBy().optArg("index", r.desc("date")).run(conn);

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

r.table("posts").get(1).g("comments").orderBy("date").run(conn);

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

r.table("posts").get(1).g("comments").orderBy(r.desc("date")).run(conn);

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

r.table("small_table").orderBy("date").run(conn);

Пример: Вы можете эффективно сортировать по нескольким полям, используя составной индекс.

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

r.table("posts").orderBy().optArg("index", "date_and_title").run(conn);

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

r.table("posts").indexCreate("date_and_title",
    post -> r.array(post.g("date"), post.g("title"))
).run(conn);

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

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

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

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

r.table("post").orderBy("title").optArg("index", "date").run(conn);

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

r.table("user").orderBy(user -> user.g("group").g("id")).run(conn);

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

r.table("posts").orderBy().optArg("index", "votes").run(conn);

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

r.table("posts").indexCreate("votes",
    post -> post.g("upvotes").sub(post.g("downvotes"))
).run(conn);

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

r.table("small_table").orderBy(
    doc -> doc.g("upvotes").sub(doc.g("downvotes"))
).run(conn);

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

r.table("small_table").orderBy(
    r.desc(doc -> doc.g("upvotes").sub(doc.g("downvotes")))
).run(conn);

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

r.table("posts")
 .between(r.time(2013, 1, 1, "+00:00"), r.time(2013, 1, 1, "+00:00"))
 .optArg("index", "date")
 .orderBy().optArg("index", "date")
 .run(conn);

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

  • skip
  • limit
  • slice

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

Spec-Zone.ru

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