Команда ReQL: do
Синтаксис команды
any.do(function) → any r.do([args]*, function) → any any.do(expr) → any r.do([args]*, expr) → any
Описание
Вызов анонимной функции с использованием значений возврата других команд или запросов ReQL в качестве аргументов.
Последний аргумент для do (или, в некоторых формах, единственный аргумент) — это выражение или анонимная функция, которая получает значения из предыдущих аргументов или из команд, связанных перед do. Команда do по существу представляет собой map с одним элементом, позволяющим применить функцию к одному документу. Это позволяет привязать результат запроса к локальной переменной в области видимости do, позволяя вычислить результат один раз и повторно использовать его в сложном выражении или ряду команд ReQL.
Аргументы, передаваемые функции do, должны быть базовыми типами данных и не могут быть потоками или выборками. (Подробнее о типах данных ReQL.) Хотя все аргументы будут вычислены до выполнения функции, они могут быть вычислены в любом порядке, поэтому их значения не должны зависеть друг от друга. Тип результата do соответствует типу значения, возвращаемого функцией или последним выражением.
Пример: Вычисление нетто-результата гольфиста в игре.
r.table('players').get('f19b5f16-ef14-468f-bd48-e194761df255').do(
function (player) {
return player('gross_score').sub(player('course_handicap'));
}
).run(conn, callback);
Пример: Возвращение лучшего игрока в двухстороннем матче по гольфу.
r.do(r.table('players').get(id1), r.table('players').get(id2),
function (player1, player2) {
return r.branch(player1('gross_score').lt(player2('gross_score')),
player1, player2);
}
).run(conn, callback);
Обратите внимание, что branch, команда условного выполнения ReQL, должна использоваться вместо if. Подробнее см. в документации branch разветвления.
Пример: Выполнение различных действий в зависимости от результата команды ReQL insert.
var newData = {
id: 100,
name: 'Agatha',
gross_score: 57,
course_handicap: 4
};
r.table('players').insert(newData).do(
function (doc) {
return r.branch(doc('inserted').ne(0),
r.table('log').insert({time: r.now(), response: doc, result: 'ok'}),
r.table('log').insert({time: r.now(), response: doc, result: 'error'}))
}
).run(conn, callback);
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/javascript/do/