Типы данных ReQL
Основные типы данных RethinkDB включают числа, строки, булевы значения, объекты, массивы и значение null. Кроме того, он хранит типы данных, специфичные для RethinkDB, включая таблицы, потоки, выборки, двоичные объекты, временные объекты, типы данных геометрии и сгруппированные данные.
Команда typeOf может быть добавлена к любой команде ReQL, чтобы отобразить тип данных, который эта команда вернет. Например (на JavaScript):
r.table('users').get(1).typeOf().run(conn, callback)
Возвращает "SELECTION<OBJECT>". (Да, тип команды typeOf — "STRING".)
Основные типы данных
-
Числа — любое действительное число:
5,3.14159,-42. RethinkDB использует числа с двойной точностью (64-битные) с плавающей запятой внутри. (Не допускаются ни бесконечность, ни NaN.) -
Строки — любая допустимая строка UTF-8:
"superhero","ünnëcëssärÿ ümläüts". Строки могут включать нулевой код (U+0000). -
Булевы значения —
trueиfalse. -
Null — значение, отличное от нуля, пустого множества или строки длиной ноль. В зависимости от языка это может быть
null,nilилиNone. Его часто используют для явного обозначения отсутствия какого-либо другого значения. Корневой узел структуры дерева может иметь родителяnull, или требуемому, но еще не инициализированному ключу может быть присвоено значениеnull. -
Объекты — JSON-объекты данных, стандартные пары ключ-значение.
{ username: 'bob', posts: 23, favorites: {color: 'blue', food: 'tacos'}, friends: ['agatha', 'jason'] }Любой допустимый JSON-объект является допустимым объектом RethinkDB, поэтому значения могут быть любыми из основных значений, массивов или других объектов. Документы в базе данных RethinkDB являются объектами. Как и в JSON, имена ключей должны быть строками, а не целыми числами.
-
Массивы — списки нуля или более элементов.
[1, 2, 3] [] [{user: 'Bob', posts: 23}, {user: 'Jason', posts: 10}]Опять же, все, что допустимо в JSON-массиве, допустимо в RethinkDB: элементы могут быть любыми из основных значений, объектов или других массивов. Массивы в RethinkDB загружаются полностью в память перед возвращением пользователю, поэтому они неэффективны при больших размерах. RethinkDB по умолчанию поддерживает массивы до 100 000 элементов; это может быть установлено в другое значение во время выполнения для чтения с помощью опции
array_limitкоманды run.
Типы данных, специфичные для RethinkDB
-
Базы данных — базы данных RethinkDB. Это тип возвращаемого значения
db. -
Таблицы — таблицы базы данных RethinkDB. Они ведут себя как выборки — они доступны для записи, так как вы можете вставлять и удалять документы в них. Методы ReQL, использующие индекс, например,
getAll, доступны только для таблиц. -
Потоки — списки, похожие на массивы, но загружаемые ленивым способом. Операции, возвращающие потоки, возвращают курсор. Курсор — это указатель в наборе результатов. Вместо чтения всех результатов сразу, как массив, вы циклом проходите по результатам, получая следующий член набора на каждой итерации. Это позволяет эффективно работать с большими наборами результатов. (См. «Работа с потоками» ниже, для некоторых советов.) Потоки являются только для чтения; вы не можете передать их как вход в команду ReQL, предназначенную для изменения входных данных, например,
updateилиdelete. -
Выборочные наборы представляют подмножества таблиц, например, возвращаемые значения
filterилиget. Существует три типа выборочных наборов: Selection<Object>, Selection<Array> и Selection<Stream>. Разница между выборками и их не-выборочными аналогами заключается в том, что выборки доступны для записи — их возвращаемые значения могут быть переданы в качестве входных данных в команды ReQL, которые изменяют базу данных. Например, командаgetвернет Selection<Object>, который затем можно передать в командуupdateилиdelete. (Примечание: singleSelection — устаревшее название для Selection<Object>; они означают одно и то же.)Некоторые команды (
orderByиbetweenвозвращают тип данных, аналогичный выборке, называемой table_slice. В большинстве случаев table_slice ведет себя так же, как выборка, ноbetweenможно вызывать только для таблицы или table_slice, а не для любого другого типа выборки. -
Псевдотипы охватывают несколько типов других данных, специфичных для ReQL, которые обычно являются композициями или специальными случаями других типов:
-
Двоичные объекты аналогичны BLOB в базах данных SQL: файлы, изображения и другие двоичные данные. Подробности см. в разделе Хранение двоичных объектов.
-
Временные метки — собственный тип данных дат/времени RethinkDB, хранящийся с точностью до миллисекунд. Вы можете использовать собственные типы дат/времени в поддерживаемых языках, так как преобразование будет выполнено драйвером. Подробности см. в разделе Даты и время в RethinkDB.
-
Типы данных геометрии для геопространственной поддержки, включая точки, линии и многоугольники. (См. ниже подробности.)
-
Сгруппированные данные создаются командой
group, которая разделяет поток на несколько групп на основе указанных полей или функций. Команды ReQL, вызванные дляGROUPED_DATA, действуют на каждой группе индивидуально. Более подробную информацию см. в документации к group. В зависимости от входных данных вgroup, сгруппированные данные могут иметь типGROUPED_STREAM.
-
Абстрактные типы данных
В документации API ReQL и некоторых сообщениях об ошибках вы встретите термины «типов данных», которые на самом деле являются классами других типов данных.
-
Данные — общее название для большинства типов данных, не являющихся потоками, включая все основные типы данных, псевдотипы, объекты и выборки, не являющиеся потоками. Типы данных Данных не включают потоки (включая Selection<Stream>), базы данных, таблицы и табличные сегменты, и функции.
-
Последовательность — любой тип данных списка: массивы, потоки, выборки и таблицы.
-
Minval и maxval используются с некоторыми командами, такими как
between, для задания абсолютных нижних и верхних границ (например,between(r.minval, 1000)вернет все документы в таблице, у которых первичный ключ меньше 1000). -
Функции могут передаваться в качестве параметров некоторым командам ReQL.
Вы также можете увидеть Любой, используемый для команд, которые работают с любым типом данных.
Порядок сортировки
Массивы (и строки) сортируются лексикографически. Объекты преобразуются в массивы перед сортировкой. Строки сортируются по кодам UTF-8 и не поддерживают сортировку по Unicode.
Смешанные последовательности данных сортируются в следующем порядке:
- массивы
- булевы значения
- null
- числа
- объекты
- двоичные объекты
- геометрические объекты
- временные метки
- строки
Это алфавитный порядок имени типа, возвращаемого командой typeOf(). (Двоичные объекты, геометрические объекты и временные метки являются «псевдотипами» и возвращают PTYPE<BINARY>, PTYPE<GEOMETRY> и PTYPE<TIME> соответственно.)
Этот пример в Data Explorer демонстрирует сортировку смешанных типов:
r.expr([
{val: 1},
{val: 2},
{val: null},
{val: 'foo'},
{val: 'bar'},
{val: [1, 2, 4]},
{val: [1, 2, 3]},
{val: true},
{val: r.now()},
{val: {foo: 100}},
{val: {bar: 200}}
]).orderBy('val')
[
{"val":[1,2,3]},
{"val":[1,2,4]},
{"val":true},
{"val":null},
{"val":1},
{"val":2},
{"val":{"bar":200}},
{"val":{"foo":100}},
{"val":{"$reql_type$":"TIME"}},
{"val":"bar"},
{"val":"foo"}
]
Типы данных геометрии
Для получения дополнительной информации об этих типах данных прочитайте о геопространственной поддержке RethinkDB.
-
Точки обозначаются одной парой координат, двумя числами с плавающей запятой, указывающими долготу (−180 до 180) и широту (−90 до 90).
-
Линии — это последовательность двух или более точек, обозначенных либо объектами точек, либо парами координат.
-
Многоугольники — это многоточечные линии, обозначаемые последовательностью трех или более точек, обозначенных либо объектами точек, либо парами координат, которые не пересекаются с собой. Первая и последняя пары координат многоугольника равны.
Многоугольники также могут иметь дыры, созданные, когда многоугольник, полностью заключённый в другой, «вырезается» из большего с помощью команды
polygonSub. (Это единственный способ создать многоугольник с дырой.)
В документации API ReQL вы также увидите «псевдотип» под названием Геометрия, который является общим для всех типов данных геометрии. Эти команды будут работать с точками, линиями и многоугольниками.
Работа с потоками
Потоки используют «ленивую загрузку», концепцию, с которой вы могли столкнуться в других интерфейсах баз данных. Вместо возвращения всего набора результатов из запроса потоки возвращают итератор, называемый «курсором», указатель в наборе данных.
Разные языки поддерживают итераторы по-разному, но основная концепция всегда одинакова: набор результатов просматривается в цикле, который возвращает один результат за раз. В Python вы можете пройтись по потоку так:
players = r.table('players').run(conn)
for player in players:
print player
В Ruby вы бы использовали блок:
players = r.table('players').run(conn)
players.each do |player|
puts player
end
JavaScript не имеет собственного итератора, но ReQL реализует команду each, аналогичную jQuery’s.
r.table('players').run(conn, function(err, cursor) {
cursor.each(function(err, player) {
if (err) throw err;
console.log(player);
});
});
Меньшие наборы результатов могут быть преобразованы в массив непосредственно, с помощью собственных конструкций языка в Python и Ruby (list(players) и players.to_a соответственно) или команд ReQL в JavaScript и Java (players.toArray() и players.toList() соответственно; см. toArray и toList документацию).
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/data-types/