Справочник команд Java ReQL
Ищете документацию для драйвера сообщества?
Найдите страницу проекта для вашего драйвера для получения конкретной документации ReQL.
Доступ к ReQL
r
r → RethinkDB
Пространство имён ReQL верхнего уровня.
Пример: Настройка пространства имён верхнего уровня.
import com.rethinkdb.RethinkDB;
import com.rethinkdb.gen.exc.ReqlError;
import com.rethinkdb.gen.exc.ReqlQueryLogicError;
import com.rethinkdb.model.MapObject;
import com.rethinkdb.net.Connection;
public static final RethinkDB r = RethinkDB.r;
connection
r.connection() → Connection.Builder
Создать новое подключение к серверу базы данных. connection возвращает конструктор подключения с методами:
-
hostname(String): хост для подключения (по умолчаниюlocalhost). -
port(Integer): порт для подключения (по умолчанию28015). -
db(String): база данных по умолчанию (по умолчаниюtest). -
user(String, String): учетная запись пользователя и пароль для подключения (по умолчанию"admin", ""). -
authKey(String): ключ аутентификации для подключения (по умолчаниюnull). -
sslContext(SSLContext): экземпляр класса SSLContext для использования при SSL-подключениях. -
certFile(InputStream): поток ввода, который будет прочитан и преобразован в SSLContext. -
timeout(Long): временной интервал ожидания подключения в миллисекундах (по умолчаниюnull). -
socketFactory(ConnectionSocket.Factory): фабрика для переопределения сокета подключения по умолчанию (по умолчаниюnull, которая использует фабрику по умолчанию). -
pumpFactory(ResponsePump.Factory): фабрика для переопределения насоса ответов по умолчанию (по умолчаниюnull, которая использует фабрику по умолчанию). -
unwrapLists(boolean): Если включено, будет раскручивать атомные ответы, которые являются списками для удобства (по умолчаниюfalse). -
defaultFetchMode(Result.FetchMode): Переопределяет режим извлечения подключения по отношению к частичным последовательностям (по умолчаниюResult.FetchMode.LAZY).
Для создания SSL-подключения к серверу RethinkDB необходимо указать либо certFile, либо sslContext. Использовать следует только один из них.
Если подключение не может быть установлено, будет брошено исключение ReqlDriverError.
Пример: Установить подключение с использованием хоста и порта по умолчанию, указав базу данных по умолчанию.
Connection conn = r.connection().connect();
close
conn.close([boolean])
Закрыть открытое подключение.
Пример: Закрыть открытое подключение, ожидая завершения операций без ответа.
conn.close();
reconnect
conn.reconnect([boolean])
Закрыть и переподключиться. Если параметр true, дождаться завершения операций без ответа перед закрытием (по умолчанию false).
Пример: Отменить незавершенные запросы/запросы, которые больше не нужны.
conn.reconnect();
use
conn.use(dbName)
Изменить базу данных по умолчанию для этого подключения.
Пример: Изменить базу данных по умолчанию, чтобы не нужно было указывать базу данных при ссылке на таблицу.
conn.use("marvel");
r.table("heroes").run(conn); // refers to r.db("marvel").table("heroes")
run
query.run(conn[, optArgs, fetchMode, typeRef]) → Result query.runAsync(conn[, optArgs, fetchMode, typeRef]) → CompletableFuture<Result>
Выполнить запрос на подключении, возвращая объект результата.
Пример: Если вы согласны с потенциально устаревшими данными из всех таблиц, вовлеченных в этот запрос, и хотите потенциально более быстрые чтения, передайте флаг, разрешающий устаревшие данные в объекте параметров. Настройки для отдельных таблиц будут переопределять эту глобальную настройку для всех таблиц в запросе.
import com.rethinkdb.model.OptArgs;
r.table("marvel").run(conn, OptArgs.of("read_mode", "outdated"));
runNoReply
query.runNoReply(conn[, optArgs])
Выполнить запрос на подключении и немедленно вернуть результат, не дожидаясь возврата данных результата сервером.
Пример: Отправить запись и немедленно вернуть результат.
r.table("marvel").insert(document).runNoReply(conn);
changes
stream.changes() → stream singleSelection.changes() → stream
Преобразовать запрос в поток изменений (changefeed), бесконечный поток объектов, представляющих изменения в результатах запроса по мере их возникновения. Поток изменений может возвращать изменения в таблице или в отдельном документе («точковый» поток изменений). Команды, такие как filter или map, могут использоваться перед командой changes для преобразования или фильтрации вывода, и многие команды, работающие с последовательностями, могут быть объединены после команды changes.
Пример: Подписаться на изменения в таблице.
Начать отслеживание потока изменений в одном клиенте:
Result<Object> changes = r.table("games").changes().run(conn);
for (Object change : changes) {
System.out.println(change);
}
По мере выполнения этих запросов во втором клиенте, первый клиент будет получать и выводить следующие объекты:
r.table("games").insert(r.hashMap("id", 1)).run(conn);
{"old_val": null, "new_val": {"id": 1}}
r.table("games").get(1).update(r.hashMap("player1", "Bob")).run(conn);
{"old_val": {"id": 1}, "new_val": {"id": 1, "player1": "Bob"}}
r.table("games").get(1).replace(
r.hashMap("id", 1).with("player1", "Bob").with("player2", "Alice")
).run(conn);
{"old_val": {"id": 1, "player1": "Bob"},
"new_val": {"id": 1, "player1": "Bob", "player2": "Alice"}}
r.table("games").get(1).delete().run(conn);
{"old_val": {"id": 1, "player1": "Bob", "player2": "Alice"}, "new_val": null}
r.tableDrop("games").run(conn);
ReqlRuntimeError: Changefeed aborted (table unavailable)
noreplyWait
conn.noreplyWait() conn.noreplyWaitAsync() → CompletableFuture
Убедитесь, что предыдущие запросы, выполненные с помощью runNoReply, были обработаны сервером. Обратите внимание, что эта гарантия применяется только к запросам, выполняемым на том же подключении.
Пример: Мы ранее выполняли запросы с помощью runNoReply. Теперь подождите, пока сервер их обработает.
conn.noreplyWait();
server
conn.server()
Возвращает информацию о сервере, используемом подключением.
Пример: Возвращение информации о сервере.
conn.server();
{
"id": "404bef53-4b2c-433f-9184-bc3f7bda4a15",
"name": "amadeus",
"proxy": false
}
optArg
term.optArg(option, value)
Указать необязательный аргумент для термина Java ReQL.
Пример: Передать необязательный аргумент right_bound к between.
r.table("marvel").between(10, 20).optArg("right_bound", "closed").run(conn);
Чтобы передать более одного необязательного аргумента, используйте optArg для каждого аргумента.
Результаты
next
result.next([timeout, unit])
Получить следующий элемент результата.
Пример: Получение следующего элемента.
try (Result<Object> result = r.table("superheroes").run(conn)) {
Object doc = result.next();
}
forEach
result.forEach(doc -> { ... })
Лениво перебрать набор результатов по одному элементу за раз.
Пример: Обработка всех элементов!
try (Result<Object> result = r.table("users").run(conn)) {
result.forEach(doc -> { System.out.println(doc); });
}
toList
result.toList()
Получить все результаты из результата в виде списка.
Пример: Для небольших наборов результатов может быть удобнее обработать их сразу как список.
try (Result<Object> result = r.table("users").run(conn)) {
processResults(result.toList());
}
close
result.close()
Закрыть результат. Закрытие результата отменяет соответствующий запрос и освобождает память, связанную с открытым запросом.
Пример: Закрытие результата.
result.close();
Работа с базами данных
dbCreate
r.dbCreate(dbName) → object
Создаёт базу данных. База данных RethinkDB — это набор таблиц, аналогично реляционным базам данных.
Пример: Создание базы данных с именем «superheroes».
r.dbCreate("superheroes").run(conn);
Возвращаемое значение:
{
"config_changes": [
{
"new_val": {
"id": "e4689cfc-e903-4532-a0e6-2d6797a43f07",
"name": "superheroes"
},
"old_val": null
}
],
"dbs_created": 1
}
dbDrop
r.dbDrop(dbName) → object
Удаляет базу данных. База данных, все её таблицы и соответствующие данные будут удалены.
Пример: Удаление базы данных с именем «superheroes».
r.dbDrop("superheroes").run(conn);
Возвращаемое значение:
{
"config_changes": [
{
"old_val": {
"id": "e4689cfc-e903-4532-a0e6-2d6797a43f07",
"name": "superheroes"
},
"new_val": null
}
],
"tables_dropped": 3,
"dbs_dropped": 1
}
dbList
r.dbList() → array
Выводит список всех имён баз данных в кластере. Результатом является список строк.
Пример: Вывод списка всех баз данных.
r.dbList().run(conn);
Работа с таблицами
tableCreate
db.tableCreate(tableName) → object r.tableCreate(tableName) → object
Создаёт таблицу. Таблица RethinkDB — это набор JSON-документов.
Пример: Создание таблицы с именем «dc_universe» с настройками по умолчанию.
r.db("heroes").tableCreate("dc_universe").run(conn);
Результат:
{
"config_changes": [
{
"new_val": {
"db": "test",
"durability": "hard",
"id": "20ea60d4-3b76-4817-8828-98a236df0297",
"name": "dc_universe",
"primary_key": "id",
"shards": [
{
"primary_replica": "rethinkdb_srv1",
"replicas": [
"rethinkdb_srv1",
"rethinkdb_srv2"
]
}
],
"write_acks": "majority"
},
"old_val": null
}
],
"tables_created": 1
}
tableDrop
db.tableDrop(tableName) → object
Удаляет таблицу из базы данных. Таблица и все её данные будут удалены.
Пример: Удаление таблицы с именем «dc_universe».
r.db("test").tableDrop("dc_universe").run(conn);
Результат:
{
"config_changes": [
{
"old_val": {
"db": "test",
"durability": "hard",
"id": "20ea60d4-3b76-4817-8828-98a236df0297",
"name": "dc_universe",
"primary_key": "id",
"shards": [
{
"primary_replica": "rethinkdb_srv1",
"replicas": [
"rethinkdb_srv1",
"rethinkdb_srv2"
]
}
],
"write_acks": "majority"
},
"new_val": null
}
],
"tables_dropped": 1
}
tableList
db.tableList() → array
Выводит список всех имён таблиц в базе данных. Результатом является список строк.
Пример: Вывод списка всех таблиц базы данных «test».
r.db("test").tableList().run(conn);
indexCreate
table.indexCreate(indexName[, indexFunction]) → object
Создаёт новый вторичный индекс в таблице. Вторичные индексы улучшают скорость многих запросов на чтение, незначительно увеличивая занимаемое пространство и уменьшая производительность записи. Для получения дополнительной информации о вторичных индексах, ознакомьтесь со статьёй «Использование вторичных индексов в RethinkDB».
Пример: Создание простого индекса, основанного на поле postId.
r.table("comments").indexCreate("postId").run(conn);
indexDrop
table.indexDrop(indexName) → object
Удаляет ранее созданный вторичный индекс этой таблицы.
Пример: Удаление вторичного индекса с именем «code_name».
r.table("dc").indexDrop("code_name").run(conn);
indexList
table.indexList() → array
Выводит список всех вторичных индексов этой таблицы.
Пример: Вывод списка доступных вторичных индексов для этой таблицы.
r.table('marvel').indexList().run(conn);
indexRename
table.indexRename(oldIndexName, newIndexName) → object
Переименовывает существующий вторичный индекс в таблице. Если optArg overwrite указан как true, ранее существовавший индекс с новым именем будет удалён, и индекс будет переименован. Если overwrite равен false (по умолчанию), будет выброшено исключение, если новый индекс с таким именем уже существует.
Пример: Переименование индекса в таблице комментариев.
r.table("comments").indexRename("postId", "messageId").run(conn);
indexStatus
table.indexStatus([, index...]) → array
Получает состояние указанных индексов в этой таблице или состояние всех индексов в этой таблице, если индексы не указаны.
Пример: Получение состояния всех индексов в test:
r.table("test").indexStatus().run(conn);
indexWait
table.indexWait([, index...]) → array
Ожидание готовности указанных индексов в этой таблице или всех индексов в этой таблице, если индексы не указаны.
Пример: Ожидание готовности всех индексов в таблице test:
r.table("test").indexWait().run(conn);
setWriteHook
table.setWriteHook(function | binary | null) → object
Устанавливает обработчик записи в таблице или перезаписывает его, если он уже существует.
Обработчик может быть анонимной функцией с сигнатурой function или двоичным представлением, полученным из поля function getWriteHook. Функция должна быть детерминированной и не может использовать подзапрос или команду r.js.
getWriteHook
table.getWriteHook() → null/object
Получает обработчик записи для этой таблицы. Если обработчик записи существует, результатом является объект следующего формата:
{
"function": <binary>,
"query": "setWriteHook(function(_var1, _var2, _var3) { return ...; })",
}
Запись данных
insert
table.insert(object | [object1, object2, ...]) → object
Вы можете передать следующие параметры с помощью optArg:
Пример: Вставка документа в таблицу posts.
r.table("posts").insert(
r.hashMap("id", 1)
.with("title", "Lorem ipsum")
.with("content", "Dolor sit amet")
).run(conn);
update
table.update(object | function) → object selection.update(object | function) → object singleSelection.update(object | function) → object
Обновление JSON-документов в таблице. Принимает JSON-документ, выражение ReQL или их комбинацию.
Пример: Обновление статуса записи с id 1 на published.
r.table("posts").get(1).update(r.hashMap("status", "published")).run(conn);
replace
table.replace(object | function) → object selection.replace(object | function) → object singleSelection.replace(object | function) → object
Замена документов в таблице. Принимает JSON-документ или выражение ReQL и заменяет исходный документ новым. Новый документ должен иметь тот же первичный ключ, что и исходный документ.
Пример: Замена документа с первичным ключом 1.
r.table("posts").get(1).replace(
r.hashMap("id", 1).with("title", "Lorem ipsum")
.with("content", "Aleas jacta est")
.with("status", "draft")
).run(conn);
delete
table.delete() → object selection.delete() → object singleSelection.delete() → object
Удаление одного или нескольких документов из таблицы.
Пример: Удаление одного документа из таблицы comments.
r.table("comments").get("7eab9e63-73f1-4f33-8ce4-95cbea626f59").delete().run(conn);
sync
table.sync() → object
Обеспечение записи данных в постоянное хранилище для заданной таблицы. Запросы, которые используют мягкую надёжность, не ждут завершения записи на диск; вызов sync для таблицы не вернётся, пока все предыдущие записи в таблицу не будут завершены, гарантируя сохранение данных.
Пример: После обновления нескольких героев с мягкой надёжностью, мы хотим дождаться, пока эти изменения будут сохранены.
r.table("marvel").sync().run(conn);
Выбор данных
db
r.db(dbName) → db
Ссылка на базу данных.
Пример: Явно укажите базу данных для запроса.
r.db("heroes").table("marvel").run(conn);
table
db.table(name) → table
Возвращает все документы в таблице. После table могут быть добавлены другие команды для возврата подмножества документов (например, get и filter) или для дальнейшей обработки.
Пример: Возвращает все документы в таблице ‘marvel’ из базы данных по умолчанию.
r.table("marvel").run(conn);
get
table.get(key) → singleRowSelection
Получить документ по первичному ключу.
Пример: Найти документ по UUID.
r.table("posts").get("a9849eef-7176-4411-935b-79a6e3c56a74").run(conn);
getAll
table.getAll([key, key2...]) → selection
Получить все документы, где заданное значение соответствует значению запрошенного индекса.
Пример: Ключи вторичных индексов не гарантируют уникальность, поэтому нельзя выполнить запрос с помощью get при использовании вторичного индекса.
r.table("marvel").getAll("man_of_steel").optArg("index", "code_name").run(conn);
between
table.between(lowerKey, upperKey) → selection
Получить все документы между двумя ключами. Принимает три optArgs: index, left_bound и right_bound. Если index задано как имя вторичного индекса, between вернёт все документы, где значение этого индекса находится в указанном диапазоне (по умолчанию используется первичный ключ). left_bound или right_bound могут быть установлены в open или closed, чтобы указать, нужно ли включать конец диапазона (по умолчанию left_bound закрыт, а right_bound открыт).
Пример: Найти всех пользователей с первичным ключом ≥ 10 и < 20 (обычный полуоткрытый интервал).
r.table("marvel").between(10, 20).run(conn);
filter
selection.filter(predicate_function) → selection stream.filter(predicate_function) → stream array.filter(predicate_function) → array
Возвращает все элементы в последовательности, для которых заданный предикат является истинным. Результат filter будет таким же, как и входные данные (последовательность, поток или массив). Документы могут быть отфильтрованы различными способами — диапазоны, вложенные значения, логические условия и результаты анонимных функций.
Пример: Получить всех пользователей, которым 30 лет.
r.table("users").filter(r.hashMap(age, 30)).run(conn);
Предикат r.hashMap(age, 30) выбирает документы в таблице users, у которых поле age имеет значение 30. Документы с полем age с другим значением или без поля age пропускаются.
Объединения
innerJoin
sequence.innerJoin(otherSequence, predicate_function) → stream array.innerJoin(otherSequence, predicate_function) → array
Возвращает внутреннее объединение двух последовательностей.
Пример: Возвращает список всех противостояний между героями Marvel и DC, в которых герой DC мог бы победить героя Marvel в бою.
r.table("marvel").innerJoin(r.table("dc"),
(marvel_row, dc_row) -> marvel_row.g("strength").lt(dc_row.g("strength"))
).zip().run(conn);
outerJoin
sequence.outerJoin(otherSequence, predicate_function) → stream array.outerJoin(otherSequence, predicate_function) → array
Возвращает левое внешнее объединение двух последовательностей. Возвращаемая последовательность представляет собой объединение левой и правой последовательностей: все документы в левой последовательности будут возвращены, каждый сопоставлен с документом в правой последовательности, если он удовлетворяет условию предиката. В большинстве случаев вам нужно будет выполнить объединение с zip, чтобы объединить левые и правые результаты.
Пример: Возвращает список всех героев Marvel, сопоставленных с любыми героями DC, которые могли бы победить их в бою.
r.table("marvel").outerJoin(r.table("dc"),
(marvel_row, dc_row) -> marvel_row.g("strength").lt(dc_row.g("strength"))
).zip().run(conn);
(Сравните это с innerJoin с теми же входными данными и предикатом, который вернёт список только тех противостояний, в которых герой DC имеет более высокую силу.)
eqJoin
sequence.eqJoin(leftField, rightTable) → sequence sequence.eqJoin(function, rightTable) → sequence
Объединяет таблицы, используя поле или функцию в левой последовательности, сопоставляя первичные ключи или вторичные индексы в правой таблице. eqJoin более эффективен, чем другие типы объединения ReQL, и работает значительно быстрее. Документы в наборе результатов представляют собой пары документов левой и правой части, сопоставленные, когда поле в левой части существует и не является null, и в указанном индексе правой части есть запись со значением этого поля.
Пример: Сопоставьте игроков с играми, в которых они играли друг против друга.
Объедините эти таблицы, используя gameId в таблице игроков и id в таблице игр:
r.table("players").eqJoin("gameId", r.table("games")).run(conn);
Это вернёт набор результатов, такой как следующий:
[
{
"left" : { "gameId" : 3, "id" : 2, "player" : "Agatha" },
"right" : { "id" : 3, "field" : "Bucklebury" }
},
{
"left" : { "gameId" : 2, "id" : 3, "player" : "Fred" },
"right" : { "id" : 2, "field" : "Rushock Bog" }
},
...
]
zip
stream.zip() → stream array.zip() → array
Используется для ‘сжатия’ результата объединения путём слияния полей ‘right’ в поля ‘left’ каждого члена последовательности.
Пример: ‘сжимает’ последовательность путём слияния полей слева и справа, полученных в результате объединения.
r.table("marvel").eqJoin("main_dc_collaborator", r.table("dc")).zip().run(conn);
Преобразования
map
sequence1.map([sequence2, ...], function) → stream array1.map([array2, ...], function) → array r.map(sequence1[, sequence2, ...], function) → stream r.map(array1[, array2, ...], function) → array
Преобразует каждый элемент одной или нескольких последовательностей, применяя к ним функцию отображения. Если map используется с двумя или более последовательностями, оно будет итерироваться по количеству элементов, содержащемуся в самой короткой последовательности.
Пример: Возвращает первые пять квадратов.
r.expr(r.array(1, 2, 3, 4, 5)).map(val -> r.mul(val, val)).run(conn);
// Result:
[1, 4, 9, 16, 25]
withFields
sequence.withFields([selector1, selector2...]) → stream array.withFields([selector1, selector2...]) → array
Извлекает одно или несколько атрибутов из последовательности объектов, отфильтровывая любые объекты в последовательности, у которых отсутствуют указанные поля. Функционально это идентично hasFields, за которым следует pluck над последовательностью.
Пример: Получение списка пользователей и их постов, исключая пользователей, которые не создали никаких постов.
Структура существующей таблицы:
[
{ "id": 1, "user": "bob", "email": "bob@foo.com", "posts": [ 1, 4, 5 ] },
{ "id": 2, "user": "george", "email": "george@foo.com" },
{ "id": 3, "user": "jane", "email": "jane@foo.com", "posts": [ 2, 3, 6 ] }
]
Команда и вывод:
r.table("users").withFields("id", "user", "posts").run(conn);
// Result passed to callback
[
{ "id": 1, "user": "bob", "posts": [ 1, 4, 5 ] },
{ "id": 3, "user": "jane", "posts": [ 2, 3, 6 ] }
]
concatMap
stream.concatMap(function) → stream array.concatMap(function) → array
Объединяет один или несколько элементов в одну последовательность с помощью функции отображения.
Пример: Построение последовательности всех монстров, побежденных героями Marvel. Поле «defeatedMonsters» — это массив из одного или нескольких имен монстров.
r.table("marvel").concatMap(hero -> hero.g("defeatedMonsters")).run(conn);
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 (по умолчанию возрастание).
Пример: Сортировка всех постов по индексу date.
r.table("posts").orderBy().optArg("index", "date").run(conn);
skip
sequence.skip(n) → stream array.skip(n) → array
Пропускает заданное количество элементов из начала последовательности.
Пример: Здесь в сочетании с orderBy мы выбираем пропустить самых успешных героев.
r.table("marvel").orderBy("successMetric").skip(10).run(conn);
limit
sequence.limit(n) → stream array.limit(n) → array
Завершает последовательность после заданного количества элементов.
Пример: В нашем Пантеоне героев помещаются только некоторые.
r.table("marvel").orderBy("belovedness").limit(10).run(conn);
slice
selection.slice(startOffset[, endOffset]) → selection stream.slice(startOffset[, endOffset]) → stream array.slice(startOffset[, endOffset]) → array binary.slice(startOffset[, endOffset]) → binary string.slice(startOffset[, endOffset]) → string
Возвращает элементы последовательности в заданном диапазоне.
Пример: Возвращает четвертого, пятого и шестого самых молодых игроков. (Самый молодой игрок имеет индекс 0, поэтому это элементы 3–5.)
r.table("players").orderBy().optArg("index", "age").slice(3, 6).run(conn);
nth
sequence.nth(index) → object selection.nth(index) → selection<object>
Получает n-ый элемент последовательности, считая с нуля. Если аргумент отрицательный, считает с последнего элемента.
Пример: Выбрать второй элемент в массиве.
r.expr(r.array(1,2,3)).nth(1).run(conn);
offsetsOf
sequence.offsetsOf(datum | predicate_function) → array
Получает индексы элемента в последовательности. Если аргумент — предикат, получает индексы всех элементов, соответствующих ему.
Пример: Найти позицию буквы ‘c’.
r.expr(r.array("a", "b", "c")).offsetsOf("c").run(conn);
isEmpty
sequence.isEmpty() → bool
Проверяет, пуста ли последовательность.
Пример: Есть ли какие-либо документы в таблице marvel?
r.table("marvel").isEmpty().run(conn);
union
stream.union(sequence[, sequence, ...]) → stream array.union(sequence[, sequence, ...]) → array r.union(stream, sequence[, sequence, ...]) → stream r.union(array, sequence[, sequence, ...]) → array
Объединяет две или более последовательностей.
Пример: Построение потока всех героев.
r.table("marvel").union(r.table("dc")).run(conn);
sample
sequence.sample(number) → selection stream.sample(number) → array array.sample(number) → array
Выбирает заданное количество элементов из последовательности с равномерным распределением случайных чисел. Выбор осуществляется без повторений.
Пример: Выберите 3 случайных героя.
r.table("marvel").sample(3).run(conn);
Агрегация
group
sequence.group([field | function...,]) → grouped_stream r.group(sequence, [field | function...,]) → grouped_stream
Принимает поток и разбивает его на несколько групп на основе предоставленных полей или функций.
Пример: Сгруппировать игры по игрокам.
r.table("games").group("player").run(conn);
Для отображения возвращаемых данных мы снова будем использовать JSON-представление, с group и values в качестве полей, соответствующих элементам в каждой GroupedResult.
[
{
"group": "Alice",
"values": [
{"id": 5, "player": "Alice", "points": 7, "type": "free"},
{"id": 12, "player": "Alice", "points": 2, "type": "free"}
]
},
{
"group": "Bob",
"values": [
{"id": 2, "player": "Bob", "points": 15, "type": "ranked"},
{"id": 11, "player": "Bob", "points": 10, "type": "free"}
]
}
]
ungroup
grouped_stream.ungroup() → array grouped_data.ungroup() → array
Принимает сгруппированный поток или сгруппированные данные и преобразует их в массив объектов, представляющих группы. Любые команды, присоединённые после ungroup, будут работать с этим массивом, а не с каждой группой по отдельности. Это полезно, если, например, вы хотите отсортировать группы по значению их сокращения.
Пример: Каково максимальное количество очков, набранных каждым игроком, с самыми результативными игроками впереди?
r.table("games").group("player").max("points").g("points").ungroup()
.orderBy(r.desc("reduction")).run(conn);
reduce
sequence.reduce(function) → value r.reduce(sequence, function) → value
Производит одно значение из последовательности посредством многократного применения функции сокращения.
Пример: Вернуть количество документов в таблице posts.
r.table("posts").map(doc -> 1).reduce(
(left, right) -> left.add(right)
).default_(0).run(conn);
Более короткий способ выполнения этого запроса — использовать count.
fold
sequence.fold(base, function) → value
sequence.fold(base, function).optArg("emit", function)[.optArg("final_emit", function)] → sequence
Применяет функцию к последовательности в порядке, сохраняя состояние через накопитель. Команда fold возвращает либо одно значение, либо новую последовательность.
Пример: Объединить слова из списка.
r.table("words").orderBy("id").fold("",
(acc, word) -> acc.add(r.branch(r.eq(acc, ""), "", ", ")).add(word)
).run(conn);
(Этот пример можно реализовать с помощью reduce, но fold сохранит порядок, когда words представляет собой таблицу RethinkDB или другой поток, что не гарантируется с reduce.)
count
sequence.count([value | predicate_function]) → number binary.count() → number string.count() → number object.count() → number r.count(sequence | binary | string | object[, predicate_function]) → number
Подсчитывает количество элементов в последовательности или пар ключ/значение в объекте, или возвращает размер строки или двоичного объекта.
Пример: Подсчитать количество пользователей.
r.table("users").count().run(conn);
sum
sequence.sum([field | function]) → number r.sum(sequence, [field | function]) → number
Суммирует все элементы последовательности. Если вызывается с именем поля, суммирует все значения этого поля в последовательности, пропускает элементы последовательности, которым это поле не принадлежит. Если вызывается с функцией, применяет эту функцию к каждому элементу последовательности и суммирует результаты, пропускает элементы последовательности, где эта функция возвращает null или ошибку не-существования.
Пример: Какова сумма 3 + 5 + 7?
r.expr(r.array(3, 5, 7)).sum().run(conn);
avg
sequence.avg([field | function]) → number r.avg(sequence, [field | function]) → number
Вычисляет среднее значение всех элементов последовательности. Если вызывается с именем поля, вычисляет среднее значение всех значений этого поля в последовательности, пропускает элементы последовательности, которым это поле не принадлежит. Если вызывается с функцией, применяет эту функцию к каждому элементу последовательности и вычисляет среднее значение результатов, пропускает элементы последовательности, где эта функция возвращает null или ошибку не-существования.
Пример: Каково среднее значение 3, 5 и 7?
r.expr(r.array(3, 5, 7)).avg().run(conn);
min
sequence.min([field | function]) → element r.min(sequence, [field | function]) → element
Находит минимальный элемент последовательности.
Пример: Вернуть минимальное значение в списке [3, 5, 7].
r.expr(r.array(3, 5, 7)).min().run(conn);
max
sequence.max([field | function]) → element r.max(sequence, [field | function]) → element
Находит максимальный элемент последовательности.
Пример: Вернуть максимальное значение в списке [3, 5, 7].
r.expr(r.array(3, 5, 7)).max().run(conn);
distinct
sequence.distinct() → array table.distinct() → stream r.distinct(sequence) → array r.distinct(table) → stream
Удаляет дубликаты из элементов в последовательности.
Пример: Какие уникальные злодеи были побеждены героями Marvel?
r.table("marvel").concatMap(
hero -> hero.g("villain_list")
).distinct().run(conn);
contains
sequence.contains([value | predicate_function, ...]) → bool r.contains(sequence, [value | predicate_function, ...]) → bool
При вызове со значениями возвращает true, если последовательность содержит все указанные значения. При вызове с предикантными функциями возвращает true, если для каждого предиката существует по крайней мере один элемент потока, где этот предикат возвращает true.
Пример: Железный человек когда-либо сражался с Суперменом?
r.table("marvel").get("ironman").g("opponents").contains("superman").run(conn);
Обработка документов
pluck
sequence.pluck([selector1, selector2...]) → stream array.pluck([selector1, selector2...]) → array object.pluck([selector1, selector2...]) → object singleSelection.pluck([selector1, selector2...]) → object
Вытаскивает одно или несколько атрибутов из объекта или последовательности объектов (проекция).
Пример: Нам нужна только информация о реакторе Железного человека, а не весь остальной документ.
r.table("marvel").get("IronMan").pluck("reactorState", "reactorPower").run(conn);
without
sequence.without([selector1, selector2...]) → stream array.without([selector1, selector2...]) → array singleSelection.without([selector1, selector2...]) → object object.without([selector1, selector2...]) → object
Противное pluck; принимает объект или последовательность объектов и возвращает их с удалёнными указанными полями или путями.
Пример: Поскольку нам это не нужно для этого вычисления, мы сэкономим пропускную способность и исключим список романтических завоеваний Железного человека.
r.table("marvel").get("IronMan").without("personalVictoriesList").run(conn);
merge
singleSelection.merge([object | function, object | function, ...]) → object object.merge([object | function, object | function, ...]) → object sequence.merge([object | function, object | function, ...]) → stream array.merge([object | function, object | function, ...]) → array
Объединяет два или более объектов для создания нового объекта со свойствами из всех. При конфликте имён полей предпочтение отдаётся полям в правом объекте в списке аргументов. merge также принимает функцию, которая возвращает объект, который будет использоваться аналогично функции map.
Пример: Подготовьте Тора к битве.
r.table("marvel").get("thor")
.merge(r.table("equipment").get("hammer"),
r.table("equipment").get("pimento_sandwich"))
.run(conn);
append
array.append(value) → array
Добавляет значение в массив.
Пример: Получить список снаряжения Железного человека с добавлением новых ботинок.
r.table("marvel").get("IronMan").g("equipment").append("newBoots").run(conn);
prepend
array.prepend(value) → array
Добавляет значение в начало массива.
Пример: Получить список снаряжения Железного человека с добавлением новых ботинок.
r.table("marvel").get("IronMan").g("equipment").prepend("newBoots").run(conn);
difference
array.difference(array) → array
Удаляет элементы одного массива из другого массива.
Пример: Получить список снаряжения Железного человека без ботинок.
r.table("marvel").get("IronMan").g("equipment").difference(r.array("Boots"))
.run(conn);
setInsert
array.setInsert(value) → array
Добавляет значение в массив и возвращает его как множество (массив с уникальными значениями).
Пример: Получить список снаряжения Железного человека с добавлением новых ботинок.
r.table("marvel").get("IronMan").g("equipment").setInsert("newBoots").run(conn);
setUnion
array.setUnion(array) → array
Выполняет пересечение двух массивов, возвращая массив со всеми уникальными элементами из обоих.
Пример: Получить список снаряжения Железного человека с добавлением новых ботинок и реактора.
r.table("marvel").get("IronMan").g("equipment")
.setUnion(r.array("newBoots", "arc_reactor")).run(conn);
setIntersection
array.setIntersection(array) → array
Пересекает два массива, возвращая значения, встречающиеся в обоих из них, как множество (массив с уникальными значениями).
Пример: Проверить, какие части снаряжения Железного человека есть из заданного списка.
r.table("marvel").get("IronMan").g("equipment")
.setIntersection(r.array("newBoots", "arc_reactor")).run(conn);
setDifference
array.setDifference(array) → array
Удаляет элементы одного массива из другого и возвращает их как множество (массив с уникальными значениями).
Пример: Проверить, какие части снаряжения Железного человека есть, исключая заданный список.
r.table("marvel").get("IronMan").g("equipment")
.setDifference(r.array("newBoots", "arc_reactor")).run(conn);
bracket
sequence.bracket(attr) → sequence singleSelection.bracket(attr) → value object.bracket(attr) → value array.bracket(index) → value
Получает одно поле из объекта. Если вызывается для последовательности, получает это поле из каждого объекта в последовательности, пропуская объекты, в которых его нет.
Пример: Какое было первое появление Железного человека в комиксе?
r.table("marvel").get("IronMan").bracket("firstAppearance").run(conn);
// more idiomatically:
r.table("marvel").get("IronMan").g("firstAppearance").run(conn);
getField, g
sequence.g(attr) → sequence singleSelection.g(attr) → value object.g(attr) → value
Получает одно поле из объекта. Если вызывается для последовательности, получает это поле из каждого объекта в последовательности, пропуская объекты, в которых его нет.
Пример: Какое было первое появление Железного человека в комиксе?
r.table("marvel").get("IronMan").g("firstAppearance").run(conn);
hasFields
sequence.hasFields([selector1, selector2...]) → stream array.hasFields([selector1, selector2...]) → array object.hasFields([selector1, selector2...]) → boolean
Проверяет, есть ли у объекта одно или несколько полей. Объект имеет поле, если у него есть этот ключ и ключ имеет значение, отличное от null. Например, объект {'a': 1,'b': 2,'c': null} имеет поля a и b.
Пример: Вернуть игроков, которые выиграли игры.
r.table("players").hasFields("games_won").run(conn);
insertAt
array.insertAt(offset, value) → array
Вставляет значение в массив по заданному индексу. Возвращает изменённый массив.
Пример: Халк решает присоединиться к Мстителям.
r.expr(r.array("Iron Man", "Spider-Man")).insertAt(1, "Hulk").run(conn);
spliceAt
array.spliceAt(offset, array) → array
Вставляет несколько значений в массив по заданному индексу. Возвращает изменённый массив.
Пример: Халк и Тор решают присоединиться к Мстителям.
r.expr(r.array("Iron Man", "Spider-Man"))
.spliceAt(1, r.array("Hulk", "Thor")).run(conn);
deleteAt
array.deleteAt(offset [,endOffset]) → array
Удаляет один или несколько элементов из массива по заданному индексу. Возвращает изменённый массив. (Примечание: deleteAt работает с массивами, а не с документами; для удаления документов см. команду delete).
Пример: Удалить второй элемент массива.
r.expr(r.array("a", "b", "c", "d", "e", "f")).deleteAt(1).run(conn);
// Result:
["a", "c", "d", "e", "f"]
changeAt
array.changeAt(offset, value) → array
Изменяет значение в массиве по заданному индексу. Возвращает изменённый массив.
Пример: Брюс Баннер превращается в Халка.
r.expr(r.array("Iron Man", "Bruce", "Spider-Man")).changeAt(1, "Hulk")
.run(conn);
keys
singleSelection.keys() → array object.keys() → array
Возвращает массив, содержащий все ключи объекта. Обратите внимание, что ключи будут отсортированы, как описано в Типы данных ReQL (для строк — лексикографически).
Пример: Получить все ключи из строки таблицы.
// row: { "id": 1, "mail": "fred@example.com", "name": "fred" }
r.table("users").get(1).keys().run(conn);
// Result:
[ "id", "mail", "name" ]
values
singleSelection.values() → array object.values() → array
Возвращает массив, содержащий все значения объекта. values() гарантирует, что значения будут выведены в том же порядке, что и ключи keys.
Пример: Получить все значения из строки таблицы.
// row: { "id": 1, "mail": "fred@example.com", "name": "fred" }
r.table("users").get(1).values().run(conn);
// Result:
[ 1, "fred@example.com", "fred" ]
literal
r.literal(object) → special
Заменяет объект в поле вместо слияния его с существующим объектом в операции merge или update. Использование literal без аргументов в операции merge или update удалит соответствующее поле.
Пример: Замените один вложенный документ другим, а не объединяйте поля.
r.table("users").get(1)
.update(r.hashMap("data", r.literal(r.hashMap("age", 19).with("job", "Engineer"))))
.run(conn);
// Result:
{
"id": 1,
"name": "Alice",
"data": {
"age": 19,
"job": "Engineer"
}
}
object
r.object([key, value,]...) → object
Создаёт объект из списка пар ключ-значение, где ключи должны быть строками. r.object(A, B, C, D) эквивалентно r.expr([[A, B], [C, D]]).coerce_to('OBJECT').
Пример: Создать простой объект.
r.object("id", 5, "data", r.array("foo", "bar")).run(conn);
// Result:
{ "data": ["foo", "bar"], "id": 5}
Обработка строк
match
string.match(regexp) → null/object
Сопоставляет строку с регулярным выражением. Если совпадение найдено, возвращает объект с полями:
-
str: Совпавшая строка -
start: Начало совпавшей строки -
end: Конец совпавшей строки -
groups: Группы захвата, определённые в скобках
Если совпадение не найдено, возвращает null.
Пример: Получить всех пользователей, чьё имя начинается с «A». Поскольку null вычисляется как false в filter, вы можете использовать результат match в качестве предиката.
r.table("users").filter(doc -> doc.g("name").match("^A")).run(conn);
split
string.split([separator, [max_splits]]) → array
Разделяет строку на подстроки. Без аргументов разделяет по пробелам; если в качестве первого аргумента указана строка, разделяет по этой строке. Также можно указать максимальное количество разделений. (Чтобы указать max_splits, сохраняя при этом разделение по пробелам, используйте null в качестве аргумента разделителя.)
Пример: Разделение по пробелам.
r.expr("foo bar bax").split().run(conn);
Результат:
["foo", "bar", "bax"]
upcase
string.upcase() → string
Преобразует строку в верхний регистр.
Пример:
r.expr("Sentence about LaTeX.").upcase().run(conn);
Результат:
"SENTENCE ABOUT LATEX."
Примечание: upcase и downcase влияют только на символы ASCII.
downcase
string.downcase() → string
Преобразует строку в нижний регистр.
Пример:
r.expr("Sentence about LaTeX.").downcase().run(conn);
Результат:
"sentence about latex."
Примечание: upcase и downcase влияют только на символы ASCII.
Математика и логика
add
value.add(value[, value, ...]) → value time.add(number[, number, ...]) → time
Сложить два или более чисел или конкатенировать две или более строки или массивы.
Пример: Это так же просто, как 2 + 2 = 4.
r.expr(2).add(2).run(conn);
// Result:
4
sub
number.sub(number[, number, ...]) → number time.sub(number[, number, ...]) → time time.sub(time) → number
Вычесть два числа.
Пример: Это так же просто, как 2 - 2 = 0.
r.expr(2).sub(2).run(conn);
mul
number.mul(number[, number, ...]) → number array.mul(number[, number, ...]) → array
Умножить два числа или создать периодический массив.
Пример: Это так же просто, как 2 * 2 = 4.
r.expr(2).mul(2).run(conn);
div
number.div(number[, number ...]) → number
Разделить два числа.
Пример: Это так же просто, как 2 / 2 = 1.
r.expr(2).div(2).run(conn);
mod
number.mod(number) → number
Пример: Это так же просто, как 2 % 2 = 0.
r.expr(2).mod(2).run(conn);
and
bool.and([bool, bool, ...]) → bool r.and([bool, bool, ...]) → bool
Вычислить логическое «и» одного или нескольких значений.
Пример: Вернуть, являются ли оба a и b истинными.
boolean a = true;
boolean b = false;
r.expr(a).and(b).run(conn);
// Result:
false
or
bool.or([bool, bool, ...]) → bool r.or([bool, bool, ...]) → bool
Вычислить логическое «или» одного или нескольких значений.
Пример: Вернуть, является ли либо a, либо b истинным.
boolean a = true;
boolean b = false;
r.expr(a).or(b).run(conn);
// Result:
true
eq
value.eq(value[, value, ...]) → bool
Проверить, равны ли два или более значения.
Пример: Убедиться, что поле role пользователя установлено в administrator.
r.table("users").get(1).g("role").eq("administrator").run(conn);
ne
value.ne(value[, value, ...]) → bool
Проверить, не равны ли два или более значения.
Пример: Убедиться, что поле role пользователя не установлено в administrator.
r.table("users").get(1).g("role").ne("administrator").run(conn);
gt
value.gt(value[, value, ...]) → bool
Сравнить значения, проверив, больше ли левое значение правого.
Пример: Проверить, набрал ли игрок более 10 очков.
r.table("players").get(1).g("score").gt(10).run(conn);
ge
value.ge(value[, value, ...]) → bool
Сравнить значения, проверив, больше ли или равно левое значение правому.
Пример: Проверить, набрал ли игрок 10 очков или больше.
r.table("players").get(1).g("score").ge(10).run(conn);
lt
value.lt(value[, value, ...]) → bool
Сравнить значения, проверив, меньше ли левое значение правого.
Пример: Проверить, набрал ли игрок менее 10 очков.
r.table("players").get(1).g("score").lt(10).run(conn);
le
value.le(value[, value, ...]) → bool
Сравнить значения, проверив, меньше ли или равно левое значение правому.
Пример: Проверить, набрал ли игрок 10 очков или меньше.
r.table("players").get(1).g("score").le(10).run(conn);
not
bool.not() → bool r.not(bool) → bool
Вычислить логическое отрицание (не) выражения.
Пример: Не истина – ложь.
r(true).not().run(conn);
r.not(true).run(conn);
Эти значения эквивалентны false.
bitAnd
r.bitAnd(number) → number r.bitAnd(number[, number, ...]) → number
Вычислить арифметическое «и» одного или нескольких значений. bitAnd принимает одно или несколько аргументов.
Пример: Вычислить арифметическое «и» 6 и 4
r.expr(6).bitAnd(4).run(conn)
bitOr
r.bitOr(number) → number r.bitOr(number[, number, ...]) → number
Вычислить арифметическое «или» одного или нескольких значений. bitOr принимает одно или несколько аргументов.
Пример: Вычислить арифметическое «или» 6 и 4
r.expr(6).bitOr(4).run(conn)
bitXor
r.bitXor(number) → number r.bitXor(number[, number, ...]) → number
Вычислить арифметическое «и» одного или нескольких значений. bitXor принимает одно или несколько аргументов.
Пример: Вычислить арифметическое «и» 6 и 4
r.expr(6).bitXor(4).run(conn)
bitNot
r.bitNot() → number
Вычислить арифметическое отрицание (не) выражения. bitNot не принимает аргументов.
Пример: Отрицать арифметическое выражение
r.expr(15).bitNot().run(conn)
bitSal
r.bitSal(number) → number r.bitSal(number[, number, ...]) → number
Вычислить арифметический сдвиг влево (левый логический сдвиг) одного или нескольких значений. bitSal принимает одно или несколько аргументов.
Пример: Вычислить арифметический сдвиг влево 5 и 4
r.expr(5).bitSal(4).run(conn)
bitSar
r.bitSar(number) → number r.bitSar(number[, number, ...]) → number
Вычислить арифметический сдвиг вправо одного или нескольких значений. bitSar принимает одно или несколько аргументов.
Пример: Вычислить арифметический сдвиг вправо 32 и 3
r.expr(32).bitSar(3).run(conn)
random
r.random() → number r.random(number[, number]) → number r.random(integer[, integer]) → integer
Сгенерировать случайное число в заданных (или подразумеваемых) пределах. random принимает ноль, одно или два аргумента, а также может принять optArg float.
Пример: Сгенерировать случайное число в диапазоне [0,1)
r.random().run(conn);
round
r.round(number) → number number.round() → number
Округляет данное значение до ближайшего целого числа.
Пример: Округлить 12.345 до ближайшего целого.
r.round(12.345).run(conn);
// Result:
12.0
Команда round также может быть подключена к выражению.
ceil
r.ceil(number) → number number.ceil() → number
Округляет данное значение вверх, возвращая наименьшее целое число, большее или равное данному значению (потолок значения).
Пример: Вернуть потолок 12.345.
r.ceil(12.345).run(conn);
// Result:
13.0
Команда ceil также может быть подключена к выражению.
floor
r.floor(number) → number number.floor() → number
Округляет данное значение вниз, возвращая наибольшее целое значение, меньшее или равное данному значению (пол значения).
Пример: Вернуть пол 12.345.
r.floor(12.345).run(conn);
// Result:
12.0
Команда floor также может быть подключена к выражению.
Даты и время
now
r.now() → time
Возвращает объект времени, представляющий текущее время в UTC. Команда now() вычисляется один раз при получении запроса сервером, поэтому несколько экземпляров r.now() всегда возвращают одно и то же время внутри запроса.
Пример: Добавить нового пользователя с временем его подписки.
r.table("users").insert(
r.hashMap("name", "John")
.with("subscription_date", r.now())
).run(conn);
time
r.time(year, month, day[, hour, minute, second], timezone) → time
Создаёт объект времени для определённого момента.
Пример: Обновить дату рождения пользователя «Иван» на 3 ноября 1986 года по UTC.
r.table("user").get("John").update(
r.hashMap("birthdate", r.time(1986, 11, 3, 'Z'))
).run(conn);
epochTime
r.epochTime(number) → time
Создаёт объект времени на основе секунд, прошедших с эпохи. Первый аргумент — double, который будет округлен до трёх знаков после запятой (точность до миллисекунды).
Пример: Обновить дату рождения пользователя «Иван» на 3 ноября 1986 года.
r.table("user").get("John").update(
r.hashMap(birthdate, r.epochTime(531360000))
).run(conn);
iso8601
r.iso8601(string) → time
Создаёт объект времени на основе строки даты и времени в формате ISO 8601 (например, ‘2013-01-01T01:01:01+00:00’). RethinkDB поддерживает все допустимые форматы ISO 8601, кроме дат недели. Подробнее о формате ISO 8601 на Википедии.
Пример: Обновить время рождения Ивана.
r.table("user").get("John").update(
r.hashMap("birth", r.iso8601("1986-11-03T08:30:00-07:00"))
).run(conn);
inTimezone
time.inTimezone(timezone) → time
Возвращает новый объект времени с другим часовым поясом. Время остаётся тем же, но результаты, возвращаемые методами, такими как hours(), изменятся, так как они учитывают часовой пояс. Аргумент часового пояса должен быть в формате ISO 8601.
Пример: Час дня в Сан-Франциско (UTC/GMT -8, без летнего времени).
r.now().inTimezone("-08:00").hours().run(conn);
timezone
time.timezone() → string
Возвращает часовой пояс объекта времени.
Пример: Возвратить всех пользователей в часовом поясе «-07:00».
r.table("users").filter(
user -> user.g("subscriptionDate").timezone().eq("-07:00")
).run(conn);
during
time.during(startTime, endTime) → bool
Возвращает, находится ли время между двумя другими временами.
Пример: Получить все сообщения, опубликованные между 1 декабря 2013 года (включительно) и 10 декабря 2013 года (исключительно).
r.table("posts").filter(
row -> row.g("date").during(r.time(2013, 12, 1, "Z"), r.time(2013, 12, 10, "Z"))
).run(conn);
date
time.date() → time
Возвращает новый объект [OffsetDateTime][odt], основанный только на дне, месяце и году (то есть тот же день в 00:00).
Пример: Получить всех пользователей, чей день рождения сегодня.
r.table("users").filter(
user -> user.g("birthdate").date().eq(r.now().date())
).run(conn);
timeOfDay
time.timeOfDay() → number
Возвращает количество секунд, прошедших с начала дня, хранящегося в объекте времени.
Пример: Получить сообщения, отправленные до полудня.
r.table("posts").filter(
post -> post.g("date").timeOfDay().le(12*60*60)
).run(conn);
year
time.year() → number
Возвращает год объекта времени.
Пример: Получить всех пользователей, родившихся в 1986 году.
r.table("users").filter(
user -> user.g("birthdate").year().eq(1986)
}).run(conn);
month
time.month() → number
Возвращает месяц объекта времени как число от 1 до 12. Для удобства определены термины r.january, r.february и т.д., сопоставленные с соответствующими целыми числами.
Пример: Получить всех пользователей, родившихся в ноябре.
r.table("users").filter(row -> row.g("birthdate").month().eq(11)).run(conn);
day
time.day() → number
Возвращает день объекта времени как число от 1 до 31.
Пример: Возвратить пользователей, родившихся 24 числа любого месяца.
r.table("users").filter(
row -> row.g("birthdate").day().eq(24)
).run(conn);
dayOfWeek
time.dayOfWeek() → number
Возвращает день недели объекта времени как число от 1 до 7 (в соответствии со стандартом ISO 8601). Для удобства определены термины r.monday, r.tuesday и т.д., сопоставленные с соответствующими целыми числами.
Пример: Возвратить день недели сегодня.
r.now().dayOfWeek().run(conn);
dayOfYear
time.dayOfYear() → number
Возвращает день года объекта времени как число от 1 до 366 (в соответствии со стандартом ISO 8601).
Пример: Получить всех пользователей, родившихся 1 числа любого года.
r.table("users").filter(
row -> row.g("birthdate").dayOfYear().eq(1)
).run(conn);
hours
time.hours() → number
Возвращает час в объекте времени как число от 0 до 23.
Пример: Возвратить все сообщения, отправленные после полуночи и до 4 утра.
r.table("posts").filter(post -> post.g("date").hours().lt(4)).run(conn);
minutes
time.minutes() → number
Возвращает минуту в объекте времени как число от 0 до 59.
Пример: Возвратить все сообщения, отправленные в первые 10 минут каждого часа.
r.table("posts").filter(post -> post.g("date").minutes().lt(10)).run(conn);
seconds
time.seconds() → number
Возвращает секунды в объекте времени как число от 0 до 59.999 (двойная точность).
Пример: Возвратить сообщение, отправленное в первые 30 секунд каждой минуты.
r.table("posts").filter(post -> post.g("date").seconds().lt(30)).run(conn);
toIso8601
time.toIso8601() → string
Преобразует объект времени в строку в формате ISO 8601.
Пример: Возвратить текущее время в формате ISO 8601.
r.now().toIso8601().run(conn);
// Result:
"2015-04-20T18:37:52.690+00:00"
toEpochTime
time.toEpochTime() → number
Преобразует объект времени в его время эпохи.
Пример: Возвратить текущее время в секундах с момента эпохи Unix с точностью до миллисекунды.
r.now().toEpochTime().run(conn);
Структуры управления
array
r.array(value[, value...]) → array
Принимает один или несколько значений в качестве аргументов и возвращает массив. (Технически, возвращает объект [List][].)
Пример: Создание массива.
r.expr(r.array(10, 20, 30)).run(conn);
Это эквивалент команды ReQL:
List<Integer> myArray = Arrays.asList(10, 20, 30);
hashMap
r.hashMap(key, value)[.with(key, value) ...] → object
Принимает пару «ключ-значение», с дополнительными парами «ключ-значение», которые могут быть указаны цепочкой одного или нескольких with(key, value) терминов после hashMap, и возвращает объект.
Пример: Создание хешмапы.
import com.rethinkdb.model.MapObject;
MapObject newData = r.hashMap("user", "fred")
.with("email", "fred@example.com")
.with("id", 101)
.with("admin", true);
Это создаёт объект (в формате JSON):
{
"admin": true,
"email": "fred@example.com",
"id": 101,
"user": "fred"
}
args
r.args(array) → special
r.args — специальный термин, используемый для вставки массива аргументов в другой термин. Это полезно, когда вы хотите вызвать многоаргументный термин, такой как getAll, с набором аргументов, созданных во время выполнения.
Пример: Получение Alice и Bob из таблицы people.
r.table("people").getAll("Alice", "Bob").run(conn);
// or
r.table("people").getAll(r.args(r.array("Alice", "Bob"))).run(conn);
binary
r.binary(data) → binary
Встраивание бинарных данных в запрос.
Пример: Сохранение изображения аватара в существующей записи пользователя.
import java.nio.file.*;
Path path = Paths.get("./defaultAvatar.png");
byte[] avatarImage = Files.readAllBytes(path);
r.table("users").get(100).update(r.hashMap("avatar", avatarImage));
do_
any.do_(function) → any r.do_([args]*, function) → any any.do_(expr) → any r.do_([args]*, expr) → any
Вызов анонимной функции, используя возвращаемые значения других команд или запросов ReQL в качестве аргументов.
Пример: Вычисление нетто-результата гольфиста для игры.
r.table("players").get("86be93eb-a112-48f5-a829-15b2cb49de1d").do_(
player -> player.g("gross_score").sub(player.g("course_handicap"))
).run(conn);
branch
r.branch(test, true_action[, test2, test2_action, ...], false_action) → any test.branch(true_action[, test2, test2_action, ...], false_action) → any
Выполнение условного ветвления, эквивалентного if-then-else.
Команда branch принимает 2n+1 аргументов: пары условных выражений и команд, которые будут выполнены, если условные выражения вернут любое значение, кроме false или null (т.е., «истинное» значение), с окончательной командой «else», которая будет выполнена, если все условные выражения являются false или null.
Пример: Проверка значения x.
int x = 10;
r.branch(r.expr(x).gt(5), "big", "small").run(conn);
// Result:
"big"
forEach
sequence.forEach(write_function) → object
Итерация по последовательности, выполняя заданный запрос записи для каждого элемента.
Пример: Теперь, когда наши герои победили своих злодеев, мы можем безопасно удалить их из таблицы злодеев.
r.table("marvel").forEach(
hero -> r.table("villains").get(hero.g("villainDefeated")).delete()
).run(conn);
range
r.range() → stream r.range([startValue, ]endValue) → stream
Генерация потока последовательных целых чисел в заданном диапазоне.
Пример: Возвращение диапазона из четырёх элементов [0, 1, 2, 3].
r.range(4).run(conn);
Результат (показан в формате JSON):
[0, 1, 2, 3]
error
r.error(message) → error
Выбрасывает ошибку выполнения. Если вызвана без аргументов внутри второго аргумента команды default, повторно выбрасывает текущую ошибку.
Пример: Железный человек не мог проиграть битву:
r.table("marvel").get("IronMan").do_(
ironman -> r.branch(
ironman.g("victories").lt(ironman.g("battles")),
r.error("impossible code path"),
ironman
)
).run(conn);
default
value.default(default_value) → any sequence.default(default_value) → any
Предоставляет значение по умолчанию в случае ошибок несуществования. Команда default оценивает свой первый аргумент (значение, к которому она прицеплена). Если этот аргумент возвращает null или при оценке выбрасывается ошибка несуществования, то default возвращает свой второй аргумент. Второй аргумент обычно является значением по умолчанию, но он может быть функцией, которая возвращает значение.
Пример: Предположим, мы хотим получить заголовки и авторов из таблицы posts. В случае, если поле «автор» отсутствует или null, мы хотим получить строку Anonymous.
r.table("posts").map(post ->
r.hashMap("title", post.g("title"))
.with("author", post.g("author").default_("Anonymous"))
).run(conn);
expr
r.expr(value) → value
Создаёт объект ReQL JSON из нативного объекта.
Пример: Объекты, обернутые с помощью expr, могут быть затем обработаны функциями API ReQL.
import com.rethinkdb.model.MapObject;
// Create object { "a": "b" }
MapObject newData = r.hashMap("a", "b");
// merge with { "b": [1, 2, 3] }
r.expr(newData).merge(r.hashMap("b", r.array(1, 2, 3))).run(conn);
js
r.js(jsString) → value
Создаёт выражение JavaScript.
Пример: Объединение двух строк с помощью JavaScript.
r.js("'str1' + 'str2'").run(conn);
coerceTo
sequence.coerceTo("array") → array
value.coerceTo("string") → string
string.coerceTo("number") → number
array.coerceTo("object") → object
sequence.coerceTo("object") → object
object.coerceTo("array") → array
binary.coerceTo("string") → string
string.coerceTo("binary") → binary
Преобразование значения одного типа в другой.
Пример: Преобразование потока в массив для хранения его вывода в поле. (Поток напрямую нельзя сохранить в поле.)
r.table("posts").map(post -> post.merge(
r.hashMap("comments",
r.table("comments").getAll(post.g("id")).optArg("index", "post_id")
.coerceTo("array"))
)).run(conn);
typeOf
any.typeOf() → string
Получение типа возвращаемого значения запроса ReQL.
Пример: Получение типа строки.
r.expr("foo").typeOf().run(conn);
// result: "STRING"
info
any.info() → object r.info(any) → object
Получение информации о значении ReQL.
Пример: Получение информации о таблице, такой как первичный ключ или размер кэша.
r.table("marvel").info().run(conn);
json
r.json(json_string) → value
Парсинг строки JSON на сервере.
Пример: Отправка массива на сервер.
r.json("[1,2,3]").run(conn);
toJsonString, toJson
value.toJsonString() → string value.toJson() → string
Преобразование значения или объекта ReQL в строку JSON. Можно использовать либо toJsonString, либо toJson.
Пример: Получение документа ReQL в виде строки JSON.
r.table("hero").get(1).toJson().run(conn)
Возвращаемые данные:
'{"id": 1, "name": "Batman", "city": "Gotham", "powers": ["martial arts", "cinematic entrances"]}'
http
r.http(url[, options]) → value r.http(url[, options]) → stream
Получение данных по указанному URL по протоколу HTTP. Тип возвращаемого значения зависит от опции resultFormat, которая по умолчанию проверяет Content-Type ответа.
Пример: Выполнение HTTP-запроса GET и сохранение результата в таблице.
r.table("posts").insert(r.http("http://httpbin.org/get")).run(conn);
uuid
r.uuid([string]) → string
Возвращает UUID (универсальный уникальный идентификатор), строку, которая может использоваться в качестве уникального идентификатора. Если строка передаётся в uuid в качестве аргумента, UUID будет детерминированным, полученным из хэша SHA-1 строки.
Пример: Генерация UUID.
r.uuid().run(conn);
// returns "27961a0e-f4e8-4eb3-bf95-c5203e1d87b9"
Геопространственные команды
circle
r.circle(r.array(longitude, latitude), radius) → geometry r.circle(point, radius) → geometry
Создаёт окружность в виде линии или многоугольника. Окружность в RethinkDB представляет собой многоугольник или линию, приближённо представляющую окружность заданного радиуса вокруг заданного центра, состоящую из заданного количества вершин (по умолчанию 32).
Пример: Определение окружности.
r.table("geo").insert(
r.hashMap("id", 300)
.with("name", "Hayes Valley")
.with("neighborhood", r.circle(r.array(-122.423246, 37.779388), 1000))
).run(conn);
distance
geometry.distance(geometry) → number r.distance(geometry, geometry) → number
Вычисляет расстояние между точкой и другим геометрическим объектом. По крайней мере, один из указанных геометрических объектов должен быть точкой.
Пример: Вычисление расстояния между двумя точками на Земле в километрах.
r.distance(
r.point(-122.423246,37.779388),
r.point(-117.220406,32.719464)
).optArg("unit", "km").run(conn);
// Result:
734.1252496021841
fill
line.fill() → polygon
Преобразует объект типа Линия в объект типа Многоугольник. Если последняя точка не совпадает по координатам с первой точкой, polygon закроет многоугольник, соединив их.
Пример: Создание объекта типа линия и его преобразование в многоугольник.
r.table("geo").insert(
r.hashMap("id", 201)
.with("rectangle", r.line(
r.array(-122.423246,37.779388),
r.array(-122.423246,37.329898),
r.array(-121.886420,37.329898),
r.array(-121.886420,37.779388)))
).run(conn);
r.table("geo").get(201).update(
r.hashMap("rectangle", row -> row.g("rectangle").fill())
).optArg("non_atomic", true).run(conn);
geojson
r.geojson(geojson) → geometry
Преобразует объект GeoJSON в геометрический объект ReQL.
Пример: Преобразование объекта GeoJSON в геометрический объект ReQL.
import com.rethinkdb.model.Geojson;
// GeoJSON object:
// {
// "type": "Point",
// "coordinates": [ -122.423246, 37.779388 ]
// }
Geojson geo = r.hashMap("type, "Point")
.with("coordinates", r.array(-122.423246, 37.779388));
r.table("geo").insert(
r.hashMap("id", "sfo")
.with("name", "San Francisco")
.with("location", r.geojson(geo))
).run(conn);
toGeojson
geometry.toGeojson() → object
Преобразует геометрический объект ReQL в объект GeoJSON.
Пример: Преобразование геометрического объекта ReQL в объект GeoJSON.
r.table("geo").get("sfo")("location").toGeojson().run(conn);
// Result:
{
"type": "Point",
"coordinates": [ -122.423246, 37.779388 ]
}
getIntersecting
table.getIntersecting(geometry).optArg("index", index) → selection<stream>
Получает все документы, где заданный геометрический объект пересекается с геометрическим объектом запрошенного геопространственного индекса.
Пример: Какие из локаций в списке парков пересекают circle1?
import com.rethinkdb.gen.ast.Circle;
Circle circle1 = r.circle(r.array(-117.220406, 32.719464), 10)
.optArg("unit", "mi");
r.table("parks").getIntersecting(circle1).optArg("index", "area").run(conn);
getNearest
table.getNearest(point).optArg("index", index) → array
Возвращает список документов, ближайших к заданной точке, на основе геопространственного индекса, отсортированных по возрастанию расстояния.
Пример: Возвращает список 25 ближайших укрытий врага к секретной базе.
import com.rethinkdb.gen.ast.Point;
Point secretBase = r.point(-122.422876,37.777128);
r.table("hideouts")
.getNearest(secretBase)
.optArg("index", "location")
.optArg("max_results", 25)
.run(conn);
includes
sequence.includes(geometry) → sequence geometry.includes(geometry) → bool
Проверяет, полностью ли один геометрический объект содержится в другом. При применении к последовательности геометрических объектов, includes действует как фильтр, возвращая последовательность объектов из последовательности, которые содержат аргумент.
Пример: Содержится ли точка внутри окружности радиусом 2000 метров?
Object point1 = r.point(-117.220406,32.719464);
Object point2 = r.point(-117.206201,32.725186);
r.circle(point1, 2000).includes(point2).run(conn);
// Result:
true
intersects
sequence.intersects(geometry) → sequence geometry.intersects(geometry) → bool r.intersects(sequence, geometry) → sequence r.intersects(geometry, geometry) → bool
Проверяет, пересекаются ли два геометрических объекта. При применении к последовательности геометрических объектов, intersects действует как фильтр, возвращая последовательность объектов из последовательности, которые пересекаются с аргументом.
Пример: Находится ли point2 внутри круга радиусом 2000 метров вокруг point1?
import com.rethinkdb.gen.ast.Point;
Point point1 = r.point(-117.220406,32.719464);
Point point2 = r.point(-117.206201,32.725186);
r.circle(point1, 2000).intersects(point2).run(conn);
// Result:
true
line
r.line([lon1, lat1], [lon2, lat2], ...) → line r.line(point1, point2, ...) → line
Создаёт геометрический объект типа Линия. Линия может быть задана двумя способами:
- Два или более массивов по два элемента, задающих широту и долготу вершин линии;
- Два или более объекта типа Точка, задающих вершины линии.
Пример: Определение линии.
r.table("geo").insert(
r.hashMap("id", 101)
.with("route", r.line(r.array(-122.423246, 37.779388),
r.array(-121.88642, 37.329898)))
).run(conn);
point
r.point(longitude, latitude) → point
Создаёт геометрический объект типа Точка. Точка задаётся двумя числами с плавающей точкой: долготой (−180 до 180) и широтой (−90 до 90) точки на идеальной сфере. См. Геопространственная поддержка для получения дополнительной информации о системе координат ReQL.
Пример: Определение точки.
r.table("geo").insert(
r.hashMap("id", 1)
.with("name", "San Francisco")
.with("location", r.point(-122.423246, 37.779388))
).run(conn);
polygon
r.polygon([lon1, lat1], [lon2, lat2], [lon3, lat3], ...) → polygon r.polygon(point1, point2, point3, ...) → polygon
Создаёт геометрический объект типа Многоугольник. Многоугольник может быть задан двумя способами:
- Три или более массивов по два элемента, задающих широту и долготу вершин многоугольника;
- Три или более объекта типа Точка, задающих вершины многоугольника.
Пример: Определение многоугольника.
r.table("geo").insert(
r.hashMap("id", 101)
.with("rectangle", r.polygon(
r.array(-122.423246, 37.779388),
r.array(-122.423246, 37.329898),
r.array(-121.88642, 37.329898),
r.array(-121.88642, 37.779388))
)
).run(conn);
polygonSub
polygon1.polygonSub(polygon2) → polygon
Используйте polygon2, чтобы «вырезать» отверстие в polygon1. polygon2 должно быть полностью внутри polygon1 и не иметь собственных отверстий (оно не должно быть результатом polygonSub).
Пример: Определение многоугольника с вырезанным отверстием.
import com.rethinkdb.gen.ast.Polygon;
Polygon outerPolygon = r.polygon(
[-122.4,37.7],
[-122.4,37.3],
[-121.8,37.3],
[-121.8,37.7]
);
Polygon innerPolygon = r.polygon(
[-122.3,37.4],
[-122.3,37.6],
[-122.0,37.6],
[-122.0,37.4]
);
outerPolygon.polygonSub(inner_polygon).run(conn);
Администрирование
grant
r.grant("username", r.hashMap("permission", bool[, ...])) → object
db.grant("username", r.hashMap("permission", bool[, ...])) → object
table.grant("username", r.hashMap("permission", bool[, ...])) → object
Предоставляет или отменяет права доступа для учётной записи пользователя, глобально или по базам данных или таблицам.
Пример: Предоставление учётной записи пользователя chatapp прав чтения и записи в базе данных users.
r.db("users").grant("chatapp", r.hashMap("read", true).with("write", true)).run(conn);
Возвращает:
{
"granted": 1,
"permissions_changes": [
{
"new_val": { "read": true, "write": true },
"old_val": { null }
}
]
config
table.config() → selection<object> database.config() → selection<object>
Запрос (чтение и/или обновление) конфигураций для отдельных таблиц или баз данных.
Пример: Получение конфигурации для таблицы users.
r.table("users").config().run(conn);
rebalance
table.rebalance() → object database.rebalance() → object
Перераспределяет фрагменты таблицы. При вызове на базе данных, все таблицы в этой базе данных будут перераспределены.
Пример: Перераспределение таблицы.
> r.table("superheroes").rebalance().run(conn);
reconfigure
table.reconfigure() → object database.reconfigure() → object
Перенастраивает фрагментацию и репликацию таблицы. Используйте следующие опции с помощью optArg:
Пример: Перенастройка таблицы.
r.table("superheroes").reconfigure().optArg("shards", 2).optArg("replicas", 1).run(conn);
status
table.status() → selection<object>
Возвращает состояние таблицы.
Пример: Получение состояния таблицы.
r.table("superheroes").status().run(conn);
wait
table.wait() → object database.wait() → object r.wait(table | database) → object
Ожидает, пока таблица или все таблицы в базе данных будут готовы. Таблица может быть временно недоступна после создания, перебалансировки или перенастройки. Команда wait блокирует выполнение до тех пор, пока заданная таблица (или база данных) не будет полностью обновлена.
Пример: Ожидание готовности таблицы.
r.table("superheroes").wait().run(conn);
Результат:
{ "ready": 1 }
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/java/