Spec-Zone.ru › RethinkDB java

Типы данных ReQL

Основные типы данных RethinkDB включают числа, строки, значения булевого типа, объекты, массивы и значение null. Кроме того, он хранит типы данных, специфичные для RethinkDB, включая таблицы, потоки, выборки, двоичные объекты, временные объекты, типы данных геометрии и сгруппированные данные.

Команду typeOf можно добавить к любой команде ReQL, чтобы отобразить тип данных, который вернёт эта команда. Например (на JavaScript):

r.table('users').get(1).typeOf().run(conn, callback)

Возвращает "SELECTION<OBJECT>". (Да, тип команды typeOf — "STRING".)

  • Основные типы данных
  • Типы данных, специфичные для RethinkDB
  • Абстрактные типы данных
  • Порядок сортировки
  • Типы данных геометрии
  • Работа с потоками

Основные типы данных

  • Числа — любое действительное число: 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> соответственно.)

Этот пример в 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API