Справочник команд JavaScript ReQL
Ищете документацию для драйвера сообщества?
Найдите страницу проекта для вашего драйвера для получения конкретной документации ReQL.
Доступ к ReQL
r
r → r
Пространство имен ReQL верхнего уровня.
Пример: Настройка пространства имен верхнего уровня.
var r = require('rethinkdb');
connect
r.connect([options, ]callback) r.connect([host, ]callback) r.connect([options]) → promise r.connect([host]) → promise
Создайте новое подключение к серверу базы данных. Принимает следующие параметры:
-
host: хост для подключения (по умолчаниюlocalhost). -
port: порт для подключения (по умолчанию28015). -
db: база данных по умолчанию (по умолчаниюtest). -
user: учетная запись пользователя для подключения (по умолчаниюadmin). -
password: пароль для учетной записи пользователя для подключения (по умолчанию'', пустой). -
timeout: период ожидания в секундах для открытия подключения (по умолчанию20). -
ssl: хэш параметров для поддержки SSL-соединений (по умолчаниюnull). В настоящее время доступен только один параметр, и если указан параметрssl, этот ключ обязателен:-
ca: список Node.jsBufferобъектов, содержащих сертификаты SSL CA.
-
Если подключение не может быть установлено, в обратный вызов будет передано ReqlDriverError, вместо подключения.
Пример: Открытие подключения, используя хост и порт по умолчанию, указав базу данных по умолчанию.
r.connect({
db: 'marvel'
}, function(err, conn) {
// ...
});
Если обратный вызов не указан, будет возвращена promise.
var promise = r.connect({db: 'marvel'});
close
conn.close([{noreplyWait: true}, ]callback)
conn.close([{noreplyWait: true}]) → promise
Закрыть открытое подключение. Если обратный вызов не указан, будет возвращена promise.
Пример: Закрыть открытое подключение, ожидая завершения записей noreply.
conn.close(function(err) { if (err) throw err; })
reconnect
conn.reconnect([{noreplyWait: true}, ]callback)
conn.reconnect([{noreplyWait: true}]) → promise
Закрыть и переподключиться. Если обратный вызов не указан, будет возвращена promise.
Пример: Отменить незавершенные запросы/запросы, которые больше не нужны.
conn.reconnect({noreplyWait: false}, function(error, connection) { ... })
use
conn.use(dbName)
Изменить базу данных по умолчанию в этом подключении.
Пример: Изменить базу данных по умолчанию, чтобы нам не нужно было указывать базу данных при ссылке на таблицу.
conn.use('marvel')
r.table('heroes').run(conn, ...) // refers to r.db('marvel').table('heroes')
run
query.run(conn[, options], callback) query.run(conn[, options]) → promise
Выполнить запрос в подключении. Обратный вызов получит ошибку, результат JSON или курсор, в зависимости от запроса.
Пример: Выполнить запрос в подключении conn и вывести каждую строку в результатах в консоль.
r.table('marvel').run(conn, function(err, cursor) {
cursor.each(console.log);
})
changes
stream.changes([options]) → stream singleSelection.changes([options]) → stream
Преобразуйте запрос в changefeed, бесконечный поток объектов, представляющих изменения в результатах запроса по мере их возникновения. Changefeed может возвращать изменения в таблице или отдельных документах (changefeed «точки»). Команды, такие как filter или map могут быть использованы перед командой changes для преобразования или фильтрации вывода, и многие команды, работающие со последовательностями, могут быть объединены после changes.
Пример: Подписаться на изменения в таблице.
Начать мониторинг changefeed в одном клиенте:
r.table('games').changes().run(conn, function(err, cursor) {
cursor.each(console.log);
});
По мере выполнения этих запросов во втором клиенте, первый клиент будет получать и выводить следующие объекты:
> r.table('games').insert({id: 1}).run(conn, callback);
{old_val: null, new_val: {id: 1}}
> r.table('games').get(1).update({player1: 'Bob'}).run(conn, callback);
{old_val: {id: 1}, new_val: {id: 1, player1: 'Bob'}}
> r.table('games').get(1).replace({id: 1, player1: 'Bob', player2: 'Alice'}).run(conn, callback);
{old_val: {id: 1, player1: 'Bob'},
new_val: {id: 1, player1: 'Bob', player2: 'Alice'}}
> r.table('games').get(1).delete().run(conn, callback)
{old_val: {id: 1, player1: 'Bob', player2: 'Alice'}, new_val: null}
> r.tableDrop('games').run(conn, callback);
ReqlRuntimeError: Changefeed aborted (table unavailable)
noreplyWait
conn.noreplyWait(callback) conn.noreplyWait() → promise
noreplyWait гарантирует, что предыдущие запросы с флагом noreply были обработаны сервером. Обратите внимание, что эта гарантия применима только к запросам, выполненным в данном подключении.
Если обратный вызов не указан, будет возвращена promise.
Пример: Мы ранее выполнили запросы с аргументом noreply установленным в true. Теперь ожидаем, пока сервер их обработает.
conn.noreplyWait(function(err) { ... })
server
conn.server(callback) conn.server() → promise
Возвращает информацию о сервере, используемом подключением.
Пример: Возвращение информации о сервере.
conn.server(callback);
// Result passed to callback
{
"id": "404bef53-4b2c-433f-9184-bc3f7bda4a15",
"name": "amadeus",
"proxy": false
}
Если обратный вызов не указан, будет возвращена promise.
EventEmitter (подключение)
connection.addListener(event, listener) connection.on(event, listener) connection.once(event, listener) connection.removeListener(event, listener) connection.removeAllListeners([event]) connection.setMaxListeners(n) connection.listeners(event) connection.emit(event, [arg1], [arg2], [...])
Подключения реализуют тот же интерфейс, что и [EventEmitter][ee] Node.js. Это позволяет вам прослушивать изменения состояния подключения.
Пример: Мониторинг состояния подключения с помощью событий.
r.connect({}, function(err, conn) {
if (err) throw err;
conn.addListener('error', function(e) {
processNetworkError(e);
});
conn.addListener('close', function() {
cleanup();
});
runQueries(conn);
});
Курсоры
next
cursor.next(callback) array.next(callback) cursor.next() → promise array.next() → promise
Получить следующий элемент в курсоре.
Пример: Получение следующего элемента.
cursor.next(function(err, row) {
if (err) throw err;
processRow(row);
});
each
cursor.each(callback[, onFinishedCallback]) array.each(callback[, onFinishedCallback]) feed.each(callback)
Лениво перебирать результат по одному элементу за раз. Второй обратный вызов является необязательным и вызывается, когда итерация останавливается (когда больше нет строк или когда обратный вызов возвращает false).
Пример: Обработаем все элементы!
cursor.each(function(err, row) {
if (err) throw err;
processRow(row);
});
eachAsync
sequence.eachAsync(function[, errorFunction]) → promise
Лениво перебирает курсор, массив или поток по одному элементу за раз. eachAsync всегда возвращает promise, который будет разрешен после возвращения всех строк.
Пример: Обработать все элементы в потоке, используя then и catch для обработки конца потока и любых ошибок. Обратите внимание, что итерация может быть остановлена в первом обратном вызове (rowProcess), вернув любое значение, отличное от Promise.
cursor.eachAsync(function (row) {
var ok = processRowData(row);
if (!ok) {
throw new Error('Bad row: ' + row);
}
}).then(function () {
console.log('done processing');
}).catch(function (error) {
console.log('Error:', error.message);
});
toArray
cursor.toArray(callback) array.toArray(callback) cursor.toArray() → promise array.toArray() → promise
Получить все результаты и передать их в виде массива в указанный обратный вызов.
Пример: Для небольших наборов результатов может быть удобнее обрабатывать их сразу как массив.
cursor.toArray(function(err, results) {
if (err) throw err;
processResults(results);
});
close
cursor.close([callback]) cursor.close() → promise
Закрыть курсор. Закрытие курсора отменяет соответствующий запрос и освобождает память, связанную с открытым запросом.
Пример: Закрыть курсор.
cursor.close(function (err) {
if (err) {
console.log("An error occurred on cursor close");
}
});
EventEmitter (курсор)
cursor.addListener(event, listener) cursor.on(event, listener) cursor.once(event, listener) cursor.removeListener(event, listener) cursor.removeAllListeners([event]) cursor.setMaxListeners(n) cursor.listeners(event) cursor.emit(event, [arg1], [arg2], [...])
Курсоры и потоки реализуют тот же интерфейс, что и EventEmitter Node.js.
Пример: Передать все сообщения с помощью socket.io.
r.table("messages").orderBy({index: "date"}).run(conn, function(err, cursor) {
if (err) {
// Handle error
return
}
cursor.on("error", function(error) {
// Handle error
})
cursor.on("data", function(message) {
socket.broadcast.emit("message", message)
})
});
Управление базами данных
dbCreate
r.dbCreate(dbName) → object
Создать базу данных. База данных RethinkDB — это коллекция таблиц, подобно реляционным базам данных.
Пример: Создать базу данных с именем «superheroes».
> r.dbCreate('superheroes').run(conn, callback);
// Result passed to callback
{
"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, callback);
// Result passed to callback
{
"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, callback)
Обработка таблиц
tableCreate
db.tableCreate(tableName[, options]) → object r.tableCreate(tableName[, options]) → object
Создайте таблицу. Таблица RethinkDB — это коллекция JSON-документов.
Пример: Создайте таблицу с именем ‘dc_universe’ с настройками по умолчанию.
> r.db('heroes').tableCreate('dc_universe').run(conn, callback);
// Result passed to callback
{
"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, callback);
// Result passed to callback
{
"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, callback)
indexCreate
table.indexCreate(indexName[, indexFunction][, {multi: false, geo: false}]) → object
Создайте новый вторичный индекс в таблице. Вторичные индексы улучшают скорость многих запросов на чтение, но при этом увеличивают занимаемое место и снижают производительность записи. Дополнительную информацию о вторичных индексах можно найти в статье «Использование вторичных индексов в RethinkDB».
Пример: Создайте простой индекс на основе поля postId.
r.table('comments').indexCreate('postId').run(conn, callback)
indexDrop
table.indexDrop(indexName) → object
Удалите ранее созданный вторичный индекс этой таблицы.
Пример: Удалите вторичный индекс с именем ‘code_name’.
r.table('dc').indexDrop('code_name').run(conn, callback)
indexList
table.indexList() → array
Выведите список всех вторичных индексов этой таблицы.
Пример: Выведите доступные вторичные индексы для этой таблицы.
r.table('marvel').indexList().run(conn, callback)
indexRename
table.indexRename(oldIndexName, newIndexName[, {overwrite: false}]) → object
Переименуйте существующий вторичный индекс в таблице. Если необязательный аргумент overwrite задан как true, то ранее существующий индекс с новым именем будет удалён, а индекс будет переименован. Если overwrite равен false (по умолчанию), то возникнет ошибка, если новый индекс с таким именем уже существует.
Пример: Переименуйте индекс в таблице комментариев.
r.table('comments').indexRename('postId', 'messageId').run(conn, callback)
indexStatus
table.indexStatus([, index...]) → array
Получите состояние указанных индексов в этой таблице или состояние всех индексов в этой таблице, если индексы не указаны.
Пример: Получите состояние всех индексов в test.
r.table('test').indexStatus().run(conn, callback)
indexWait
table.indexWait([, index...]) → array
Подождите, пока указанные индексы в этой таблице будут готовы или все индексы в этой таблице будут готовы, если индексы не указаны.
Пример: Подождите, пока все индексы в таблице test будут готовы:
r.table('test').indexWait().run(conn, callback)
setWriteHook
table.setWriteHook(function | binary | null) → object
Устанавливает хук записи в таблицу или перезаписывает его, если он уже существует.
Хук может быть анонимной функцией с сигнатурой (context: object, oldVal: object, newVal: object) -> object или двоичным представлением, полученным из поля function метода getWriteHook. Функция должна быть детерминированной, поэтому она не может использовать подзапрос или команду r.js.
getWriteHook
table.getWriteHook() → null/object
Получает хук записи этой таблицы. Если хук записи существует, результат — объект следующего формата:
{
"function": <binary>,
"query": "setWriteHook(function(_var1, _var2, _var3) { return ...; })",
}
Запись данных
insert
table.insert(object | [object1, object2, ...][, {durability: "hard", returnChanges: false, conflict: "error"}]) → object
Вставка документов в таблицу. Принимает один документ или массив документов.
Пример: Вставьте документ в таблицу posts.
r.table("posts").insert({
id: 1,
title: "Lorem ipsum",
content: "Dolor sit amet"
}).run(conn, callback)
update
table.update(object | function[, {durability: "hard", returnChanges: false, nonAtomic: false}]) → object
selection.update(object | function[, {durability: "hard", returnChanges: false, nonAtomic: false}]) → object
singleSelection.update(object | function[, {durability: "hard", returnChanges: false, nonAtomic: false}]) → object
Обновление JSON-документов в таблице. Принимает JSON-документ, выражение ReQL или комбинацию из них.
Пример: Обновите статус поста с id от 1 до published.
r.table("posts").get(1).update({status: "published"}).run(conn, callback)
replace
table.replace(object | function[, {durability: "hard", returnChanges: false, nonAtomic: false}]) → object
selection.replace(object | function[, {durability: "hard", returnChanges: false, nonAtomic: false}]) → object
singleSelection.replace(object | function[, {durability: "hard", returnChanges: false, nonAtomic: false}]) → object
Замена документов в таблице. Принимает JSON-документ или выражение ReQL и заменяет оригинальный документ новым. Новый документ должен иметь тот же первичный ключ, что и оригинальный.
Пример: Замените документ с первичным ключом 1.
r.table("posts").get(1).replace({
id: 1,
title: "Lorem ipsum",
content: "Aleas jacta est",
status: "draft"
}).run(conn, callback)
delete
table.delete([{durability: "hard", returnChanges: false}]) → object
selection.delete([{durability: "hard", returnChanges: false}]) → object
singleSelection.delete([{durability: "hard", returnChanges: false}]) → object
Удаление одного или нескольких документов из таблицы.
Пример: Удалите один документ из таблицы comments.
r.table("comments").get("7eab9e63-73f1-4f33-8ce4-95cbea626f59").delete().run(conn, callback)
sync
table.sync() → object
sync гарантирует, что записи в данной таблице записываются в постоянное хранилище. Запросы, которые указывают мягкую надёжность ({durability: 'soft'}), не дают таких гарантий, поэтому sync может использоваться для обеспечения состояния этих запросов. Вызов sync не возвращает значение, пока все предыдущие записи в таблице не будут сохранены.
Пример: После обновления нескольких героев с мягкой надёжностью, мы хотим дождаться, пока эти изменения не будут сохранены.
r.table('marvel').sync().run(conn, callback)
Выбор данных
db
r.db(dbName) → db
Ссылка на базу данных.
Пример: Явно укажите базу данных для запроса.
r.db('heroes').table('marvel').run(conn, callback)
table
db.table(name[, {readMode: 'single', identifierFormat: 'name'}]) → table
Возвращает все документы в таблице. После table могут быть добавлены другие команды для возврата подмножества документов (например, get и filter) или для дальнейшей обработки.
Пример: Возвращает все документы в таблице ‘marvel’ из базы данных по умолчанию.
r.table('marvel').run(conn, callback)
get
table.get(key) → singleRowSelection
Получить документ по первичному ключу.
Пример: Найти документ по UUID.
r.table('posts').get('a9849eef-7176-4411-935b-79a6e3c56a74').run(conn, callback);
getAll
table.getAll([key, key2...], [, {index:'id'}]) → selection
Получить все документы, где заданное значение соответствует значению запрошенного индекса.
Пример: Ключи вторичных индексов не гарантируют уникальность, поэтому мы не можем выполнить запрос через get при использовании вторичного индекса.
r.table('marvel').getAll('man_of_steel', {index:'code_name'}).run(conn, callback)
between
table.between(lowerKey, upperKey[, options]) → table_slice table_slice.between(lowerKey, upperKey[, options]) → table_slice
Получить все документы между двумя ключами. Принимает три необязательных аргумента: index, leftBound, и rightBound. Если index установлено в имя вторичного индекса, between вернёт все документы, где значение этого индекса находится в заданном диапазоне (по умолчанию используется первичный ключ). leftBound или rightBound могут быть установлены в open или closed, чтобы указать, включать ли этот конечный пункт диапазона (по умолчанию leftBound закрыт, а rightBound открыт).
Пример: Найти всех пользователей с первичным ключом ≥ 10 и < 20 (обычный полуоткрытый интервал).
r.table('marvel').between(10, 20).run(conn, callback);
filter
selection.filter(predicate_function[, {default: false}]) → selection
stream.filter(predicate_function[, {default: false}]) → stream
array.filter(predicate_function[, {default: false}]) → array
Возвращает все элементы в последовательности, для которых заданный предикат является истинным. Результат filter будет таким же, как и входные данные (последовательность, поток или массив). Документы могут быть отфильтрованы различными способами: диапазоны, вложенные значения, булевы условия и результаты анонимных функций.
Пример: Получить всех пользователей, которым 30 лет.
r.table('users').filter({age: 30}).run(conn, callback);
Предикат {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'), function(marvelRow, dcRow) {
return marvelRow('strength').lt(dcRow('strength'))
}).zip().run(conn, callback)
outerJoin
sequence.outerJoin(otherSequence, predicate_function) → stream array.outerJoin(otherSequence, predicate_function) → array
Возвращает левое внешнее объединение двух последовательностей. Возвращаемая последовательность представляет собой объединение левой и правой последовательностей: все документы в левой последовательности будут возвращены, каждый сопоставленный с документом в правой последовательности, если он удовлетворяет условиям предиката. В большинстве случаев вы захотите после объединения использовать zip для объединения левых и правых результатов.
Пример: Возвращает список всех героев Marvel, сопоставленных с любыми героями DC, которые могли бы их победить в бою.
r.table('marvel').outerJoin(r.table('dc'), function(marvelRow, dcRow) {
return marvelRow('strength').lt(dcRow('strength'))
}).run(conn, callback)
(Сравните это с innerJoin с теми же входными данными и предикатом, который вернёт список только тех противостояний, в которых герой DC обладает большей силой.)
eqJoin
sequence.eqJoin(leftField, rightTable[, {index: 'id', ordered: false}]) → sequence
sequence.eqJoin(function, rightTable[, {index: 'id', ordered: false}]) → sequence
Объединяет таблицы, используя поле или функцию в левой последовательности, соответствующей первичным ключам или вторичным индексам в правой таблице. eqJoin более эффективен, чем другие типы объединений ReQL, и работает значительно быстрее. Документы в наборе результатов представляют собой пары документов левой и правой сторон, соответствующие друг другу, когда поле в левой части существует и не является пустым, а запись с этим значением поля существует в указанном индексе правой части.
Пример: Сопоставить игроков с играми, в которых они играли друг против друга.
Объедините эти таблицы, используя gameId в таблице игроков и id в таблице игр:
r.table('players').eqJoin('gameId', r.table('games')).run(conn, callback)
Это вернёт набор результатов, такой как следующий:
[
{
"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, callback)
Преобразования
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([1, 2, 3, 4, 5]).map(function (val) {
return val.mul(val);
}).run(conn, callback);
// Result passed to callback
[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, callback)
// 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(function(hero) {
return hero('defeatedMonsters')
}).run(conn, callback)
orderBy
table.orderBy([key | function...], {index: index_name}) → table_slice
selection.orderBy(key | function[, ...]) → selection<array>
sequence.orderBy(key | function[, ...]) → array
Сортировать последовательность по значениям документов заданного ключа(ей). Для указания порядка оберните атрибут либо r.asc либо r.desc (по умолчанию — возрастание).
Пример: Отсортировать все посты по индексу date.
r.table('posts').orderBy({index: 'date'}).run(conn, callback);
skip
sequence.skip(n) → stream array.skip(n) → array
Пропустить определённое количество элементов из начала последовательности.
Пример: Здесь, в сочетании с orderBy, мы выбираем игнорировать самых успешных героев.
r.table('marvel').orderBy('successMetric').skip(10).run(conn, callback)
limit
sequence.limit(n) → stream array.limit(n) → array
Завершить последовательность после указанного количества элементов.
Пример: В наш Пантеон героев могут поместиться только ограниченное количество.
r.table('marvel').orderBy('belovedness').limit(10).run(conn, callback)
slice
selection.slice(startOffset[, endOffset, {leftBound:'closed', rightBound:'open'}]) → selection
stream.slice(startOffset[, endOffset, {leftBound:'closed', rightBound:'open'}]) → stream
array.slice(startOffset[, endOffset, {leftBound:'closed', rightBound:'open'}]) → array
binary.slice(startOffset[, endOffset, {leftBound:'closed', rightBound:'open'}]) → binary
string.slice(startOffset[, endOffset, {leftBound:'closed', rightBound:'open'}]) → string
Возвратить элементы последовательности в указанном диапазоне.
Пример: Возвратить четвёртого, пятого и шестого самых молодых игроков. (Самый молодой игрок имеет индекс 0, поэтому это элементы 3–5.)
r.table('players').orderBy({index: 'age'}).slice(3,6).run(conn, callback);
nth
sequence.nth(index) → object selection.nth(index) → selection<object>
Получить n-й элемент последовательности, считая с нуля. Если аргумент отрицательный, считать с последнего элемента.
Пример: Выберите второй элемент в массиве.
r.expr([1,2,3]).nth(1).run(conn, callback)
r.expr([1,2,3])(1).run(conn, callback)
offsetsOf
sequence.offsetsOf(datum | predicate_function) → array
Получить индексы элемента в последовательности. Если аргумент — предикат, получить индексы всех элементов, соответствующих ему.
Пример: Найти позицию буквы ‘c’.
r.expr(['a','b','c']).offsetsOf('c').run(conn, callback)
isEmpty
sequence.isEmpty() → bool
Проверить, является ли последовательность пустой.
Пример: Есть ли какие-либо документы в таблице marvel?
r.table('marvel').isEmpty().run(conn, callback)
union
stream.union(sequence[, sequence, ...][, {interleave: true}]) → stream
array.union(sequence[, sequence, ...][, {interleave: true}]) → array
r.union(stream, sequence[, sequence, ...][, {interleave: true}]) → stream
r.union(array, sequence[, sequence, ...][, {interleave: true}]) → array
Объединить две или более последовательностей.
Пример: Построить поток всех героев.
r.table('marvel').union(r.table('dc')).run(conn, callback);
sample
sequence.sample(number) → selection stream.sample(number) → array array.sample(number) → array
Выбрать заданное количество элементов из последовательности с равномерным распределением случайных чисел. Выбор происходит без возврата.
Пример: Выбрать 3 случайных героев.
r.table('marvel').sample(3).run(conn, callback)
Агрегирование
group
sequence.group(field | function..., [{index: <indexname>, multi: false}]) → grouped_stream
r.group(sequence, field | function..., [{index: <indexname>, multi: false}]) → grouped_stream
Принимает поток и разбивает его на несколько групп на основе предоставленных полей или функций.
Пример: Сгруппировать игры по игроку.
> r.table('games').group('player').run(conn, callback)
// Result passed to callback
[
{
group: "Alice",
reduction: [
{id: 5, player: "Alice", points: 7, type: "free"},
{id: 12, player: "Alice", points: 2, type: "free"}
]
},
{
group: "Bob",
reduction: [
{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')('points')
.ungroup().orderBy(r.desc('reduction')).run(conn, callback)
reduce
sequence.reduce(function) → value r.reduce(sequence, function) → value
Производит одно значение из последовательности посредством повторного применения функции сворачивания.
Пример: Возвращает количество документов в таблице posts.
r.table("posts").map(function(doc) {
return 1;
}).reduce(function(left, right) {
return left.add(right);
}).default(0).run(conn, callback);
Более короткий способ выполнения этого запроса — использовать count.
fold
sequence.fold(base, function) → value
sequence.fold(base, function, {emit: function[, finalEmit: function]}) → sequence
Применяет функцию к последовательности в порядке, сохраняя состояние через накопитель. Команда fold возвращает либо одно значение, либо новую последовательность.
Пример: Объединение слов из списка.
r.table('words').orderBy('id').fold('', function (acc, word) {
return acc.add(r.branch(acc.eq(''), '', ', ')).add(word);
}).run(conn, callback);
(Этот пример можно реализовать с помощью 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, callback);
sum
sequence.sum([field | function]) → number r.sum(sequence, [field | function]) → number
Суммирует все элементы последовательности. Если вызвана с именем поля, суммирует все значения этого поля в последовательности, пропуская элементы последовательности, которые этого поля не имеют. Если вызвана с функцией, вызывает эту функцию для каждого элемента последовательности и суммирует результаты, пропуская элементы последовательности, где эта функция возвращает null или ошибку отсутствия значения.
Пример: Чему равно 3 + 5 + 7?
r.expr([3, 5, 7]).sum().run(conn, callback)
avg
sequence.avg([field | function]) → number r.avg(sequence, [field | function]) → number
Вычисляет среднее значение всех элементов последовательности. Если вызвана с именем поля, вычисляет среднее значение всех значений этого поля в последовательности, пропуская элементы последовательности, которые этого поля не имеют. Если вызвана с функцией, вызывает эту функцию для каждого элемента последовательности и вычисляет среднее значение результатов, пропуская элементы последовательности, где эта функция возвращает null или ошибку отсутствия значения.
Пример: Чему равно среднее значение 3, 5 и 7?
r.expr([3, 5, 7]).avg().run(conn, callback)
min
sequence.min(field | function) → element
sequence.min({index: <indexname>}) → element
r.min(sequence, field | function) → element
r.min(sequence, {index: <indexname>}) → element
Находит минимальный элемент последовательности.
Пример: Вернуть минимальное значение в списке [3, 5, 7].
r.expr([3, 5, 7]).min().run(conn, callback);
max
sequence.max(field | function) → element
sequence.max({index: <indexname>}) → element
r.max(sequence, field | function) → element
r.max(sequence, {index: <indexname>}) → element
Находит максимальный элемент последовательности.
Пример: Вернуть максимальное значение в списке [3, 5, 7].
r.expr([3, 5, 7]).max().run(conn, callback);
distinct
sequence.distinct() → array
table.distinct([{index: <indexname>}]) → stream
r.distinct(sequence) → array
r.distinct(table, [{index: <indexname>}]) → stream
Удаляет дубликаты из элементов в последовательности.
Пример: Какие уникальные злодеи были побеждены героями Marvel?
r.table('marvel').concatMap(function(hero) {
return hero('villainList')
}).distinct().run(conn, callback)
contains
sequence.contains([value | predicate_function, ...]) → bool r.contains(sequence, [value | predicate_function, ...]) → bool
При вызове со значениями, возвращает true , если последовательность содержит все указанные значения. При вызове с предикатными функциями, возвращает true , если для каждого предиката существует по крайней мере один элемент потока, где этот предикат возвращает true.
Пример: Ирон Мэн когда-либо сражался с Суперменом?
r.table('marvel').get('ironman')('opponents').contains('superman').run(conn, callback);
Обработка документов
row
r.row → value
Возвращает текущий посещаемый документ.
Пример: Получить всех пользователей, чей возраст больше 5.
r.table('users').filter(r.row('age').gt(5)).run(conn, callback)
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, callback)
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, callback)
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, callback)
append
array.append(value) → array
Добавляет значение в массив.
Пример: Получить список оборудования Железного человека с добавлением новых ботинок.
r.table('marvel').get('IronMan')('equipment').append('newBoots').run(conn, callback)
prepend
array.prepend(value) → array
Добавляет значение в начало массива.
Пример: Получить список оборудования Железного человека с добавлением новых ботинок.
r.table('marvel').get('IronMan')('equipment').prepend('newBoots').run(conn, callback)
difference
array.difference(array) → array
Удаляет элементы одного массива из другого массива.
Пример: Получить список оборудования Железного человека без ботинок.
r.table('marvel').get('IronMan')('equipment')
.difference(['Boots'])
.run(conn, callback)
setInsert
array.setInsert(value) → array
Добавляет значение в массив и возвращает его как множество (массив с уникальными значениями).
Пример: Получить список оборудования Железного человека с добавлением новых ботинок.
r.table('marvel').get('IronMan')('equipment').setInsert('newBoots').run(conn, callback)
setUnion
array.setUnion(array) → array
Добавляет несколько значений в массив и возвращает его как множество (массив с уникальными значениями).
Пример: Получить список оборудования Железного человека с добавлением новых ботинок и реактора.
r.table('marvel').get('IronMan')('equipment').setUnion(['newBoots', 'arc_reactor']).run(conn, callback)
setIntersection
array.setIntersection(array) → array
Пересечение двух массивов, возвращающее значения, присутствующие в обоих, как множество (массив с уникальными значениями).
Пример: Проверить, какое оборудование Железного человека есть в заданном списке.
r.table('marvel').get('IronMan')('equipment').setIntersection(['newBoots', 'arc_reactor']).run(conn, callback)
setDifference
array.setDifference(array) → array
Удаляет элементы одного массива из другого и возвращает их как множество (массив с уникальными значениями).
Пример: Проверить, какое оборудование Железного человека есть, исключая заданный список.
r.table('marvel').get('IronMan')('equipment').setDifference(['newBoots', 'arc_reactor']).run(conn, callback)
() (bracket)
sequence(attr) → sequence singleSelection(attr) → value object(attr) → value array(index) → value
Получает одно поле из объекта. Если вызвана на последовательности, получает это поле из каждого объекта в последовательности, пропускает объекты, у которых его нет.
Пример: Каково было первое появление Железного человека в комиксе?
r.table('marvel').get('IronMan')('firstAppearance').run(conn, callback)
getField
sequence.getField(attr) → sequence singleSelection.getField(attr) → value object.getField(attr) → value
Получает одно поле из объекта. Если вызвана на последовательности, получает это поле из каждого объекта в последовательности, пропускает объекты, у которых его нет.
Пример: Каково было первое появление Железного человека в комиксе?
r.table('marvel').get('IronMan').getField('firstAppearance').run(conn, callback)
hasFields
sequence.hasFields([selector1, selector2...]) → stream array.hasFields([selector1, selector2...]) → array object.hasFields([selector1, selector2...]) → boolean
Проверяет наличие одного или нескольких полей в объекте. Объект имеет поле, если у него есть этот ключ и ключ имеет ненулевое значение. Например, объект {'a': 1,'b': 2,'c': null} имеет поля a и b.
Пример: Возвратить игроков, которые выиграли игры.
r.table('players').hasFields('games_won').run(conn, callback)
insertAt
array.insertAt(offset, value) → array
Вставляет значение в массив по заданному индексу. Возвращает измененный массив.
Пример: Халк решает присоединиться к Мстителям.
r.expr(["Iron Man", "Spider-Man"]).insertAt(1, "Hulk").run(conn, callback)
spliceAt
array.spliceAt(offset, array) → array
Вставляет несколько значений в массив по заданному индексу. Возвращает измененный массив.
Пример: Халк и Тор решают присоединиться к Мстителям.
r.expr(["Iron Man", "Spider-Man"]).spliceAt(1, ["Hulk", "Thor"]).run(conn, callback)
deleteAt
array.deleteAt(offset [,endOffset]) → array
Удаляет один или несколько элементов из массива по заданному индексу. Возвращает измененный массив. (Примечание: deleteAt работает с массивами, а не с документами; для удаления документов см. команду delete).
Пример: Удалить второй элемент массива.
> r(['a','b','c','d','e','f']).deleteAt(1).run(conn, callback)
// result passed to callback
['a', 'c', 'd', 'e', 'f']
changeAt
array.changeAt(offset, value) → array
Изменяет значение в массиве по заданному индексу. Возвращает измененный массив.
Пример: Брюс Баннер превращается в Халка.
r.expr(["Iron Man", "Bruce", "Spider-Man"]).changeAt(1, "Hulk").run(conn, callback)
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, callback);
// Result passed to callback
[ "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, callback);
// Result passed to callback
[ 1, "fred@example.com", "fred" ]
literal
r.literal(object) → special
Заменяет объект в поле вместо его объединения с существующим объектом в операции merge или update. Использование literal без аргументов в операции merge или update удалит соответствующее поле.
Пример: Замените один вложенный документ другим, а не объединяйте поля.
r.table('users').get(1).update({ data: r.literal({ age: 19, job: 'Engineer' }) }).run(conn, callback)
// Result passed to callback
{
"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]]).coerceTo('OBJECT').
Пример: Создать простой объект.
r.object('id', 5, 'data', ['foo', 'bar']).run(conn, callback)
Результат:
{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(function(doc){
return doc('name').match("^A")
}).run(conn, callback)
split
string.split([separator, [max_splits]]) → array
Разбивает строку на подстроки. Разбивает по пробелам, если вызывается без аргументов. При вызове с разделителем, разбивает по этому разделителю. При вызове с разделителем и максимальным числом разбиений, разбивает по разделителю не более max_splits раз. (Можно вызвать с null как разделителем, чтобы разбить по пробелам, при этом всё ещё указав max_splits.)
Пример: Разбиение по пробелам.
r.expr("foo bar bax").split().run(conn, callback)
Результат:
["foo", "bar", "bax"]
upcase
string.upcase() → string
Преобразует строку в верхний регистр.
Пример:
r.expr("Sentence about LaTeX.").upcase().run(conn, callback)
Результат:
"SENTENCE ABOUT LATEX."
Примечание: upcase и downcase влияют только на символы ASCII.
downcase
string.downcase() → string
Преобразует строку в нижний регистр.
Пример:
r.expr("Sentence about LaTeX.").downcase().run(conn, callback)
Результат:
"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, callback)
// result passed to callback
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, callback)
mul
number.mul(number[, number, ...]) → number array.mul(number[, number, ...]) → array
Умножает два числа или создает периодический массив.
Пример: Это так же просто, как 2 * 2 = 4.
r.expr(2).mul(2).run(conn, callback)
div
number.div(number[, number ...]) → number
Делит два числа.
Пример: Это так же просто, как 2 / 2 = 1.
r.expr(2).div(2).run(conn, callback)
mod
number.mod(number) → number
Пример: Это так же просто, как 2 % 2 = 0.
r.expr(2).mod(2).run(conn, callback)
and
bool.and([bool, bool, ...]) → bool r.and([bool, bool, ...]) → bool
Вычисляет логическое «и» одного или нескольких значений.
Пример: Возвращает, истинны ли оба a и b.
var a = true, b = false;
r.expr(a).and(b).run(conn, callback);
// result passed to callback
false
or
bool.or([bool, bool, ...]) → bool r.or([bool, bool, ...]) → bool
Вычисляет логическое «или» одного или нескольких значений.
Пример: Возвращает, истинно ли хотя бы одно из a или b.
var a = true, b = false;
r.expr(a).or(b).run(conn, callback);
// result passed to callback
true
eq
value.eq(value[, value, ...]) → bool
Проверяет, равны ли два или более значений.
Пример: Проверьте, установлено ли поле role пользователя на administrator.
r.table('users').get(1)('role').eq('administrator').run(conn, callback);
ne
value.ne(value[, value, ...]) → bool
Проверяет, не равны ли два или более значений.
Пример: Проверьте, не установлено ли поле role пользователя на administrator.
r.table('users').get(1)('role').ne('administrator').run(conn, callback);
gt
value.gt(value[, value, ...]) → bool
Сравнивает значения, проверяя, больше ли левое значение, чем правое.
Пример: Проверьте, набрал ли игрок больше 10 очков.
r.table('players').get(1)('score').gt(10).run(conn, callback);
ge
value.ge(value[, value, ...]) → bool
Сравнивает значения, проверяя, больше или равно ли левое значение правому.
Пример: Проверьте, набрал ли игрок 10 или более очков.
r.table('players').get(1)('score').ge(10).run(conn, callback);
lt
value.lt(value[, value, ...]) → bool
Сравнивает значения, проверяя, меньше ли левое значение, чем правое.
Пример: Проверьте, набрал ли игрок меньше 10 очков.
r.table('players').get(1)('score').lt(10).run(conn, callback);
le
value.le(value[, value, ...]) → bool
Сравнивает значения, проверяя, меньше или равно ли левое значение правому.
Пример: Проверьте, набрал ли игрок 10 или меньше очков.
r.table('players').get(1)('score').le(10).run(conn, callback);
not
bool.not() → bool not(bool) → bool
Вычисляет логическое отрицание (не) выражения.
Пример: Не истинно — ложно.
r(true).not().run(conn, callback)
r.not(true).run(conn, callback)
Они равны 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], {float: true}) → number
r.random(integer[, integer]) → integer
Генерирует случайное число в заданных (или подразумеваемых) пределах. random принимает ноль, одно или два аргумента.
Пример: Сгенерировать случайное число в диапазоне [0,1)
r.random().run(conn, callback)
round
r.round(number) → number number.round() → number
Округляет данное значение до ближайшего целого числа.
Пример: Округлить 12.345 до ближайшего целого числа.
r.round(12.345).run(conn, callback);
// Result passed to callback
12.0
Команда round также может быть использована после выражения.
ceil
r.ceil(number) → number number.ceil() → number
Округляет данное значение вверх, возвращая наименьшее целое значение, большее или равное данному значению (потолок значения).
Пример: Возвратить потолок 12.345.
r.ceil(12.345).run(conn, callback);
// Result passed to callback
13.0
Команда ceil также может быть использована после выражения.
floor
r.floor(number) → number number.floor() → number
Округляет данное значение вниз, возвращая наибольшее целое значение, меньшее или равное данному значению (пол значения).
Пример: Возвратить пол 12.345.
r.floor(12.345).run(conn, callback);
// Result passed to callback
12.0
Команда floor также может быть использована после выражения.
Даты и время
now
r.now() → time
Возвращает объект времени, представляющий текущее время в UTC. Команда now() вычисляется один раз при получении запроса сервером, поэтому несколько экземпляров r.now() всегда возвращают одно и то же время внутри запроса.
Пример: Добавление нового пользователя со временем его подписки.
r.table("users").insert({
name: "John",
subscription_date: r.now()
}).run(conn, callback)
time
r.time(year, month, day[, hour, minute, second], timezone) → time
Создаёт объект времени для определённого момента.
Пример: Обновление даты рождения пользователя «John» на 3 ноября 1986 года в UTC.
r.table("user").get("John").update({birthdate: r.time(1986, 11, 3, 'Z')}).run(conn, callback)
epochTime
r.epochTime(number) → time
Создаёт объект времени на основе количества секунд, прошедших с эпохи. Первый аргумент — число с плавающей точкой, которое будет округлено до трёх знаков после запятой (точность в миллисекундах).
Пример: Обновление даты рождения пользователя «John» на 3 ноября 1986 года.
r.table("user").get("John").update({birthdate: r.epochTime(531360000)}).run(conn, callback)
ISO8601
r.ISO8601(string[, {defaultTimezone:''}]) → time
Создаёт объект времени на основе строки даты и времени в формате ISO 8601 (например, ‘2013-01-01T01:01:01+00:00’). RethinkDB поддерживает все допустимые форматы ISO 8601, кроме форматов дат по неделям. Подробнее о формате ISO 8601 см. на Wikipedia.
Пример: Обновление времени рождения Джона.
r.table("user").get("John").update({birth: r.ISO8601('1986-11-03T08:30:00-07:00')}).run(conn, callback)
inTimezone
time.inTimezone(timezone) → time
Возвращает новый объект времени с другим часовым поясом. Хотя время остаётся неизменным, результаты, возвращаемые методами, такими как hours(), изменятся, так как они учитывают часовой пояс. Аргумент часового пояса должен быть в формате ISO 8601.
Пример: Час дня в Сан-Франциско (UTC/GMT -8, без летнего времени).
r.now().inTimezone('-08:00').hours().run(conn, callback)
timezone
time.timezone() → string
Возвращает часовой пояс объекта времени.
Пример: Возвращает всех пользователей в часовом поясе «-07:00».
r.table("users").filter( function(user) {
return user("subscriptionDate").timezone().eq("-07:00")
})
during
time.during(startTime, endTime[, {leftBound: "closed", rightBound: "open"}]) → bool
Возвращает значение true, если время находится между двумя другими временами.
Пример: Получение всех сообщений, опубликованных между 1 декабря 2013 года (включительно) и 10 декабря 2013 года (исключая).
r.table("posts").filter(
r.row('date').during(r.time(2013, 12, 1, "Z"), r.time(2013, 12, 10, "Z"))
).run(conn, callback)
date
time.date() → time
Возвращает новый объект времени, содержащий только день, месяц и год (т.е. тот же день в 00:00).
Пример: Получение всех пользователей, чей день рождения сегодня.
r.table("users").filter(function(user) {
return user("birthdate").date().eq(r.now().date())
}).run(conn, callback)
timeOfDay
time.timeOfDay() → number
Возвращает количество секунд, прошедших с начала дня, хранящегося в объекте времени.
Пример: Получение сообщений, отправленных до полудня.
r.table("posts").filter(
r.row("date").timeOfDay().le(12*60*60)
).run(conn, callback)
year
time.year() → number
Возвращает год объекта времени.
Пример: Получение всех пользователей, родившихся в 1986 году.
r.table("users").filter(function(user) {
return user("birthdate").year().eq(1986)
}).run(conn, callback)
month
time.month() → number
Возвращает месяц объекта времени как число от 1 до 12. Для удобства определены r.january, r.february и т.д., которые соответствуют соответствующему целому числу.
Пример: Получение всех пользователей, родившихся в ноябре.
r.table("users").filter(
r.row("birthdate").month().eq(11)
)
day
time.day() → number
Возвращает день объекта времени как число от 1 до 31.
Пример: Возвращение пользователей, родившихся 24 числа любого месяца.
r.table("users").filter(
r.row("birthdate").day().eq(24)
).run(conn, callback)
dayOfWeek
time.dayOfWeek() → number
Возвращает день недели объекта времени как число от 1 до 7 (в соответствии со стандартом ISO 8601). Для удобства определены r.monday, r.tuesday и т.д., которые соответствуют соответствующему целому числу.
Пример: Возвращение дня недели сегодня.
r.now().dayOfWeek().run(conn, callback)
dayOfYear
time.dayOfYear() → number
Возвращает день года объекта времени как число от 1 до 366 (в соответствии со стандартом ISO 8601).
Пример: Получение всех пользователей, родившихся первого числа года.
r.table("users").filter(
r.row("birthdate").dayOfYear().eq(1)
)
hours
time.hours() → number
Возвращает час в объекте времени как число от 0 до 23.
Пример: Возвращение всех сообщений, отправленных после полуночи и до 4 часов утра.
r.table("posts").filter(function(post) {
return post("date").hours().lt(4)
})
minutes
time.minutes() → number
Возвращает минуту в объекте времени как число от 0 до 59.
Пример: Возвращение всех сообщений, отправленных в первые 10 минут каждого часа.
r.table("posts").filter(function(post) {
return post("date").minutes().lt(10)
})
seconds
time.seconds() → number
Возвращает секунды в объекте времени как число от 0 до 59.999 (с двойной точностью).
Пример: Возвращение сообщений, отправленных в первые 30 секунд каждой минуты.
r.table("posts").filter(function(post) {
return post("date").seconds().lt(30)
})
toISO8601
time.toISO8601() → string
Преобразует объект времени в строку в формате ISO 8601.
Пример: Возвращение текущего времени в формате ISO 8601.
r.now().toISO8601().run(conn, callback)
// Result passed to callback
"2015-04-20T18:37:52.690+00:00"
toEpochTime
time.toEpochTime() → number
Преобразует объект времени в его эпоху.
Пример: Возвращение текущего времени в секундах с момента эпохи Unix с точностью до миллисекунд.
r.now().toEpochTime()
Структуры управления
args
r.args(array) → special
r.args — это специальный термин, используемый для вставки массива аргументов в другой термин. Это полезно, когда вы хотите вызвать вариативный термин, такой как getAll, с набором аргументов, созданных во время выполнения.
Пример: Получить Алису и Боба из таблицы people.
r.table('people').getAll('Alice', 'Bob').run(conn, callback)
// or
r.table('people').getAll(r.args(['Alice', 'Bob'])).run(conn, callback)
binary
r.binary(data) → binary
Инкапсулировать двоичные данные в запросе.
Пример: Сохранить изображение аватара в записи существующего пользователя.
var fs = require('fs');
fs.readFile('./defaultAvatar.png', function (err, avatarImage) {
if (err) {
// Handle error
}
else {
r.table('users').get(100).update({
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('f19b5f16-ef14-468f-bd48-e194761df255').do(
function (player) {
return player('gross_score').sub(player('course_handicap'));
}
).run(conn, callback);
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 (т.е. “истинностные” значения), с окончательной командой «иначе», которая должна быть вычислена, если все условные выражения являются false или null.
Пример: Проверить значение x.
var x = 10;
r.branch(r.expr(x).gt(5), 'big', 'small').run(conn, callback);
// Result passed to callback
"big"
forEach
sequence.forEach(write_function) → object
Перебрать последовательность, оценивая заданный запрос записи для каждого элемента.
Пример: Теперь, когда наши герои победили своих злодеев, мы можем безопасно удалить их из таблицы злодеев.
r.table('marvel').forEach(function(hero) {
return r.table('villains').get(hero('villainDefeated')).delete()
}).run(conn, callback)
range
r.range() → stream r.range([startValue, ]endValue) → stream
Генерировать поток последовательных целых чисел в указанном диапазоне.
Пример: Вернуть диапазон из четырёх элементов [0, 1, 2, 3].
> r.range(4).run(conn, callback)
// result returned to callback
[0, 1, 2, 3]
error
r.error(message) → error
Вызвать ошибку во время выполнения. Если вызывается без аргументов внутри второго аргумента default, повторно вызывать текущую ошибку.
Пример: Железный человек не мог так проиграть битву:
r.table('marvel').get('IronMan').do(function(ironman) {
return r.branch(ironman('victories').lt(ironman('battles')),
r.error('impossible code path'),
ironman)
}).run(conn, callback)
default
value.default(default_value | function) → any sequence.default(default_value | function) → any
Предоставить значение по умолчанию в случае ошибок отсутствия данных. Команда default оценивает свой первый аргумент (значение, к которому она прикреплена). Если этот аргумент возвращает null или вызывается ошибка отсутствия данных при оценке, то default возвращает свой второй аргумент. Второй аргумент обычно является значением по умолчанию, но он может быть функцией, возвращающей значение.
Пример: Получить заголовки и авторов таблицы posts. В случае, если поле автора отсутствует или null, мы хотим получить строку Anonymous.
r.table("posts").map(function (post) {
return {
title: post("title"),
author: post("author").default("Anonymous")
}
}).run(conn, callback);
expr
r.expr(value) → value
Построить объект ReQL JSON из нативного объекта.
Пример: Объекты, обернутые с expr, затем могут быть обработаны функциями API ReQL.
r.expr({a:'b'}).merge({b:[1,2,3]}).run(conn, callback)
js
r.js(jsString[, {timeout: <number>}]) → value
Создать выражение JavaScript.
Пример: Объединить две строки с помощью JavaScript.
r.js("'str1' + 'str2'").run(conn, callback)
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(function (post) {
return post.merge({ comments: r.table('comments').getAll(post('id'), {index: 'postId'}).coerceTo('array')});
}).run(conn, callback)
typeOf
any.typeOf() → string
Получить тип возвращаемого значения запроса ReQL.
Пример: Получить тип строки.
r.expr("foo").typeOf().run(conn, callback);
// Result passed to callback
"STRING"
info
any.info() → object r.info(any) → object
Получить информацию о значении ReQL.
Пример: Получить информацию о таблице, такую как первичный ключ или размер кэша.
r.table('marvel').info().run(conn, callback)
json
r.json(json_string) → value
Обработать строку JSON на сервере.
Пример: Отправить массив на сервер.
r.json("[1,2,3]").run(conn, callback)
toJsonString, toJSON
value.toJsonString() → string value.toJSON() → string
Преобразовать значение или объект ReQL в строку JSON. Можно использовать либо toJsonString или toJSON.
Пример: Получить документ ReQL в виде строки JSON.
> r.table('hero').get(1).toJSON()
// result returned to callback
'{"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 ответа. Убедитесь, что вы никогда не используете эту команду для URL, предоставленных пользователем.
Пример: Выполнить HTTP GET и сохранить результат в таблице.
r.table('posts').insert(r.http('http://httpbin.org/get')).run(conn, callback)
uuid
r.uuid([string]) → string
Возвратить UUID (универсальный уникальный идентификатор) — строку, которая может использоваться в качестве уникального идентификатора. Если в uuid в качестве аргумента передаётся строка, UUID будет детерминированным, выведенным из хеша SHA-1 строки.
Пример: Сгенерировать UUID.
> r.uuid().run(conn, callback)
// result returned to callback
"27961a0e-f4e8-4eb3-bf95-c5203e1d87b9"
Геопространственные команды
circle
r.circle([longitude, latitude], radius[, {numVertices: 32, geoSystem: 'WGS84', unit: 'm', fill: true}]) → geometry
r.circle(point, radius[, {numVertices: 32, geoSystem: 'WGS84', unit: 'm', fill: true}]) → geometry
Создаёт круговую линию или многоугольник. Круг в RethinkDB — это многоугольник или линия, приближённо представляющие окружность заданного радиуса вокруг заданного центра, состоящую из заданного числа вершин (по умолчанию 32).
Пример: Определение круга.
r.table('geo').insert({
id: 300,
name: 'Hayes Valley',
neighborhood: r.circle([-122.423246,37.779388], 1000)
}).run(conn, callback);
distance
geometry.distance(geometry[, {geoSystem: 'WGS84', unit: 'm'}]) → number
r.distance(geometry, geometry[, {geoSystem: 'WGS84', unit: 'm'}]) → number
Вычисляет расстояние между точкой и другим геометрическим объектом. По крайней мере, один из указанных геометрических объектов должен быть точкой.
Пример: Вычисление расстояния между двумя точками на Земле в километрах.
var point1 = r.point(-122.423246,37.779388);
var point2 = r.point(-117.220406,32.719464);
r.distance(point1, point2, {unit: 'km'}).run(conn, callback);
// result returned to callback
734.1252496021841
fill
line.fill() → polygon
Преобразует объект типа Line в объект типа Polygon. Если последняя точка не задаёт те же координаты, что и первая, polygon закроет многоугольник, соединив их.
Пример: Создание объекта типа линия и его преобразование в многоугольник.
r.table('geo').insert({
id: 201,
rectangle: r.line(
[-122.423246,37.779388],
[-122.423246,37.329898],
[-121.886420,37.329898],
[-121.886420,37.779388]
)
}).run(conn, callback);
r.table('geo').get(201).update({
rectangle: r.row('rectangle').fill()
}, {nonAtomic: true}).run(conn, callback);
geojson
r.geojson(geojson) → geometry
Преобразует объект GeoJSON в геометрический объект ReQL.
Пример: Преобразование объекта GeoJSON в геометрический объект ReQL.
var geoJson = {
'type': 'Point',
'coordinates': [ -122.423246, 37.779388 ]
};
r.table('geo').insert({
id: 'sfo',
name: 'San Francisco',
location: r.geojson(geoJson)
}).run(conn, callback);
toGeojson
geometry.toGeojson() → object
Преобразует геометрический объект ReQL в объект GeoJSON.
Пример: Преобразование геометрического объекта ReQL в объект GeoJSON.
r.table('geo').get('sfo')('location').toGeojson.run(conn, callback);
// result passed to callback
{
'type': 'Point',
'coordinates': [ -122.423246, 37.779388 ]
}
getIntersecting
table.getIntersecting(geometry, {index: 'indexname'}) → selection<stream>
Получает все документы, где данный геометрический объект пересекает геометрический объект запрошенного геопространственного индекса.
Пример: Какие из мест в списке парков пересекают circle1?
var circle1 = r.circle([-117.220406,32.719464], 10, {unit: 'mi'});
r.table('parks').getIntersecting(circle1, {index: 'area'}).run(conn, callback);
getNearest
table.getNearest(point, {index: 'indexname'[, maxResults: 100, maxDist: 100000, unit: 'm', geoSystem: 'WGS84']}) → array
Возвращает список документов, наиболее близких к заданной точке, на основе геопространственного индекса, отсортированных по возрастанию расстояния.
Пример: Возвращает список 25 ближайших вражеских укрытий к секретной базе.
var secretBase = r.point(-122.422876,37.777128);
r.table('hideouts').getNearest(secretBase,
{index: 'location', maxResults: 25}
).run(conn, callback)
includes
sequence.includes(geometry) → sequence geometry.includes(geometry) → bool
Проверяет, полностью ли один геометрический объект содержится в другом. При применении к последовательности геометрических объектов, includes действует как фильтр, возвращая последовательность объектов из последовательности, содержащие аргумент.
Пример: point2 включено в круг радиусом 2000 метров вокруг point1?
var point1 = r.point(-117.220406,32.719464);
var point2 = r.point(-117.206201,32.725186);
r.circle(point1, 2000).includes(point2).run(conn, callback);
// result returned to callback
true
intersects
sequence.intersects(geometry) → sequence geometry.intersects(geometry) → bool r.intersects(sequence, geometry) → sequence r.intersects(geometry, geometry) → bool
Проверяет, пересекаются ли два геометрических объекта. При применении к последовательности геометрических объектов, intersects действует как фильтр, возвращая последовательность объектов из последовательности, пересекающих аргумент.
Пример: point2 находится внутри круга радиусом 2000 метров вокруг point1?
var point1 = r.point(-117.220406,32.719464);
var point2 = r.point(-117.206201,32.725186);
r.circle(point1, 2000).intersects(point2).run(conn, callback);
// result returned to callback
true
line
r.line([lon1, lat1], [lon2, lat2], ...) → line r.line(point1, point2, ...) → line
Создаёт геометрический объект типа Line. Линию можно указать двумя способами:
- Два или более двухэлементных массивов, указывающих широту и долготу вершин линии;
- Два или более объектов Point, указывающих вершины линии.
Пример: Определение линии.
r.table('geo').insert({
id: 101,
route: r.line([-122.423246,37.779388], [-121.886420,37.329898])
}).run(conn, callback);
point
r.point(longitude, latitude) → point
Создаёт геометрический объект типа Point. Точка задаётся двумя числами с плавающей точкой, долготой (−180 до 180) и широтой (−90 до 90) точки на идеальной сфере. Дополнительная информация о системе координат ReQL приведена в разделе Геопространственная поддержка.
Пример: Определение точки.
r.table('geo').insert({
id: 1,
name: 'San Francisco',
location: r.point(-122.423246,37.779388)
}).run(conn, callback);
polygon
r.polygon([lon1, lat1], [lon2, lat2], [lon3, lat3], ...) → polygon r.polygon(point1, point2, point3, ...) → polygon
Создаёт геометрический объект типа Polygon. Многоугольник можно указать двумя способами:
- Три или более двухэлементных массивов, указывающих широту и долготу вершин многоугольника;
- Три или более объектов Point, указывающих вершины многоугольника.
Пример: Определение многоугольника.
r.table('geo').insert({
id: 101,
rectangle: r.polygon(
[-122.423246,37.779388],
[-122.423246,37.329898],
[-121.886420,37.329898],
[-121.886420,37.779388]
)
}).run(conn, callback);
polygonSub
polygon1.polygonSub(polygon2) → polygon
Используйте polygon2 для создания отверстия в polygon1. polygon2 должен быть полностью включён в polygon1 и не должен иметь отверстий (не должен быть результатом работы polygonSub).
Пример: Определение многоугольника с отверстием.
var outerPolygon = r.polygon(
[-122.4,37.7],
[-122.4,37.3],
[-121.8,37.3],
[-121.8,37.7]
);
var innerPolygon = r.polygon(
[-122.3,37.4],
[-122.3,37.6],
[-122.0,37.6],
[-122.0,37.4]
);
outerPolygon.polygonSub(innerPolygon).run(conn, callback);
Администрирование
grant
r.grant("username", {permission: bool[, ...]}) → object
db.grant("username", {permission: bool[, ...]}) → object
table.grant("username", {permission: bool[, ...]}) → object
Предоставляет или отменяет права доступа для учетной записи пользователя, глобально или на уровне базы данных или таблицы.
Пример: Предоставление учетной записи пользователя chatapp прав на чтение и запись в базе данных users.
r.db('users').grant('chatapp', {read: true, write: true}).run(conn, callback);
// Result passed to callback
{
"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, callback);
rebalance
table.rebalance() → object database.rebalance() → object
Перебалансирует фрагменты таблицы. При вызове для базы данных перебалансируются все таблицы в этой базе данных.
Пример: Перебалансировка таблицы.
> r.table('superheroes').rebalance().run(conn, callback);
reconfigure
table.reconfigure({shards: <s>, replicas: <r>[, primaryReplicaTag: <t>, dryRun: false, nonvotingReplicaTags: null}]) → object
database.reconfigure({shards: <s>, replicas: <r>[, primaryReplicaTag: <t>, dryRun: false, nonvotingReplicaTags: null}]) → object
table.reconfigure(emergencyRepair: <option>, dryRun: false) → object
Переконфигурирует фрагментацию и репликацию таблицы.
Пример: Переконфигурирование таблицы.
> r.table('superheroes').reconfigure({shards: 2, replicas: 1}).run(conn, callback);
status
table.status() → selection<object>
Возвращает состояние таблицы.
Пример: Получение состояния таблицы.
> r.table('superheroes').status().run(conn, callback);
wait
table.wait([{waitFor: 'all_replicas_ready', timeout: <sec>}]) → object
database.wait([{waitFor: 'all_replicas_ready', timeout: <sec>}]) → object
r.wait(table | database, [{waitFor: 'all_replicas_ready', timeout: <sec>}]) → object
Ожидание готовности таблицы или всех таблиц в базе данных. Таблица может быть временно недоступна после создания, перебалансировки или переконфигурации. Команда wait блокирует выполнение, пока указанная таблица (или база данных) не будет полностью обновлена.
Пример: Ожидание готовности таблицы.
> r.table('superheroes').wait().run(conn, callback);
// Result passed to callback
{ "ready": 1 }
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/javascript/