Команда ReQL: do_
Синтаксис команды
any.do_(function) → any r.do_([args]*, function) → any any.do_(expr) → any r.do_([args]*, expr) → any
Описание
Вызов анонимной функции с использованием значений возврата из других команд или запросов ReQL в качестве аргументов.
Последний аргумент к do_ (или, в некоторых формах, единственный аргумент) — это выражение или анонимная функция, которая получает значения из предыдущих аргументов или из команд, объединённых перед do_. Команда do_ по сути представляет собой одноэлементную отображение, позволяющую отобразить функцию по одному документу. Это позволяет связать результат запроса с локальной переменной в рамках области действия do_, позволяя вычислить результат один раз и повторно использовать его в сложном выражении или в серии команд ReQL.
Аргументы, передаваемые в функцию do_, должны быть базовыми типами данных и не могут быть потоками или выборками. (Подробнее о типах данных ReQL.) Хотя все аргументы будут вычислены перед выполнением функции, они могут быть вычислены в любом порядке, поэтому их значения не должны зависеть друг от друга. Тип результата do_ — это тип значения, возвращаемого функцией или последним выражением.
Пример: Вычисление нетто-результата гольфиста за игру.
r.table("players").get("86be93eb-a112-48f5-a829-15b2cb49de1d").do_(
player -> player.g("gross_score").sub(player.g("course_handicap"))
).run(conn);
Пример: Возвращение лучшего игрока в гольф-матче для двух игроков.
r.do_(r.table("players").get(id1), r.table("players").get(id2),
(player1, player2) -> r.branch(
player1.g("gross_score").lt(player2.g("gross_score")),
player1,
player2
)
).run(conn);
Обратите внимание, что branch, команда ReQL для условного выполнения, должна использоваться вместо if. См. документацию branch здесь для получения дополнительной информации.
Пример: Выполнение различных действий в зависимости от результата команды ReQL вставки.
import com.rethinkdb.model.MapObject;
MapObject newData = r.hashMap("id", 100)
.with("name", "Agatha")
.with("gross_score", 57)
.with("course_handicap", 4);
r.table("players").insert(newData).do_(doc ->
r.branch(doc.g("inserted").ne(0),
r.table("log").insert(
r.hashMap("time", r.now())
.with("response", doc)
.with("result", "ok")),
r.table("log").insert(
r.hashMap("time", r.now())
.with("response", doc)
.with("result", "error"))
)
).run(conn);
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/java/do/