Spec-Zone.ru › RethinkDB ruby

Типы данных 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> соответственно.)

Этот пример в окне просмотра данных демонстрирует сортировку смешанных типов:

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