Типы данных 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. Существует три типа выборок: Выборки<Объект>, Выборки<Массив> и Выборки<Поток>. Разница между выборками и их аналогами без выбора в том, что выборки доступны для записи — их возвращаемые значения могут быть переданы в качестве входных данных командам ReQL, которые изменяют базу данных. Например, командаgetвернёт выборку<Объект>, которую затем можно передать командамupdateилиdelete. (Примечание: singleSelection — устаревшее название для выбора<Объект>; они обозначают одно и то же.)Некоторые команды (
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.
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/