Команда 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 и не поддерживает сортировку по Юникоду; символы, не являющиеся ASCII, будут отсортированы по кодовым точкам UTF-8. Более подробную информацию о порядке сортировки в RethinkDB см. в разделе Типы данных ReQL.
Сортировка без индекса требует, чтобы сервер хранил последовательность в памяти, и ограничена 100 000 документами (или значением параметра arrayLimit для команды 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 элементов (или вы изменили значение параметра arrayLimit для команды 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', lambda 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(lambda user: user['group']['id']).run(conn)
Пример: Можно эффективно сортировать данные по произвольным выражениям с использованием индексов.
r.table('posts').order_by(index='votes').run(conn)
Индекс должен быть создан ранее с помощью index_create.
r.table('posts').index_create('votes', lambda 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/python/order_by/