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