Spec-Zone.ru › RethinkDB python

Типы данных 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 и не поддерживают сортировку по 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/

Spec-Zone.ru

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