Типы данных 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 и не поддерживают сортировку Юникода.
Смешанные последовательности данных сортируются в следующем порядке:
- массивы
- булевы значения
- null
- числа
- объекты
- двоичные объекты
- геометрические объекты
- времена
- строки
Это алфавитный порядок их имени типа, возвращаемого командой typeOf(). (Двоичные объекты, геометрические объекты и времена — «псевдотипы» и возвращают PTYPE<BINARY>, PTYPE<GEOMETRY> и PTYPE<TIME> соответственно.)
Этот пример в окне просмотра данных демонстрирует сортировку смешанных типов:
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/