Spec-Zone.ru › MariaDB

CONNECT MONGO Тип таблицы: Доступ к коллекциям из MongoDB

Классифицированная как программа базы данных NoSQL, MongoDB использует документы, похожие на JSON (BSON), сгруппированные в коллекции. Тип MONGO используется для прямого доступа к коллекциям MongoDB как к таблицам.

Доступ к MongoDB из CONNECT

Доступ к MongoDB из CONNECT можно осуществить различными способами:

  1. В качестве таблицы MONGO через драйвер MongoDB C.
  2. В качестве таблицы MONGO через драйвер MongoDB Java.
  3. В качестве таблицы JDBC, используя некоторые коммерческие драйверы JDBC для MongoDB.
  4. В качестве таблицы JSON через драйвер MongoDB C или Java.

Использование драйвера MongoDB C

В настоящее время это недоступно из бинарных дистрибутивов, а только для версий, скомпилированных из исходного кода. Предпочтительная версия драйвера MongoDB C — 1.7, поскольку они обеспечивают распознавание пакетов. Необходимо выполнить следующие действия:

  1. Установить libbson и драйвер MongoDB C 1.7.
  2. Настроить, скомпилировать и установить MariaDB.

В более ранних версиях драйвера Mongo C дополнительные каталоги включаемых файлов и библиотеки необходимо будет указать вручную при компиляции.

Если это возможно, это предпочтительный способ доступа, так как он не требует всех настроек пути Java и т. д. и быстрее, чем использование драйвера Java.

Использование драйвера Mongo Java

Это возможно со всеми дистрибутивами, включая поддержку JDBC, или при компиляции из исходного кода. С бинарным дистрибутивом, который не включает тип таблицы MONGO, можно получить доступ к MongoDB с помощью модуля OEM. Подробности см. в Примере таблицы CONNECT OEM. Дополнительные действия следующие:

  1. Установить драйвер MongoDB Java, скачав его файл jar. Доступно несколько версий. Если возможно, используйте последнюю версию 3.
  2. Добавить путь к нему в переменную среды CLASSPATH или в переменную connect_class_path. Это аналогично тому, как объявляются драйверы JDBC.

Соединение устанавливается с помощью новых Java-обёрток Mongo3Interface и Mongo2Interface. Они доступны в дистрибутиве JDBC в файлах Mongo2.jar и Mongo3.jar (ранее JavaWrappers.jar). Если используется версия 2 драйвера Java, укажите «Version=2» в списке опций при создании таблиц.

Использование JDBC

См. документацию по существующим коммерческим драйверам JDBC для Mongo.

Использование JSON

См. соответствующий раздел по типу таблицы JSON.

Далее описывается тип таблицы MONGO.

Таблицы CONNECT MONGO

Создание и выполнение таблиц MONGO требует подключения к работающему локальному или удалённому серверу MongoDB.

Таблица MONGO определяется для доступа к коллекции MongoDB. Строки таблицы будут документами коллекции. Например, чтобы создать таблицу на основе коллекции MongoDB sample collection restaurants, можно сделать следующее:

create table resto (
_id varchar(24) not null,
name varchar(64) not null,
cuisine char(200) not null,
borough char(16) not null,
restaurant_id varchar(12) not null)
engine=connect table_type=MONGO tabname='restaurants'
data_charset=utf8 connection='mongodb://localhost:27017';

Примечание: По умолчанию используется драйвер C, если установлен только драйвер MongoDB C, и драйвер Java, если установлен только драйвер MongoDB Java. Если оба доступны, можно указать драйвер с помощью опции DRIVER в списке опций, по умолчанию это C.

Здесь мы не определили все элементы документов коллекции, а только те, которые являются JSON-значениями. По умолчанию база данных — test. Значение подключения — URI, используемый для установления соединения с локальным или удалённым сервером MongoDB. Значение, показанное в этом примере, соответствует локальному серверу, запущенному с его стандартным портом. Это значение подключения по умолчанию для таблиц MONGO, поэтому можно было его опустить.

Доступно использование обнаружения.

Эта таблица могла быть создана так:

create table resto
engine=connect table_type=MONGO tabname='restaurants'
data_charset=utf8 option_list='level=-1';

Здесь «depth=-1» используется для создания только столбцов, которые являются простыми значениями (без массивов или объектов). Без этого, со значением по умолчанию «depth=0», таблица была бы создана как:

CREATE TABLE `resto` (
  `_id` char(24) NOT NULL,
  `address` varchar(136) NOT NULL,
  `borough` char(13) NOT NULL,
  `cuisine` char(64) NOT NULL,
  `grades` varchar(638) NOT NULL,
  `name` char(98) NOT NULL,
  `restaurant_id` char(8) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `DATA_CHARSET`='utf8';

Устранение проблем с mariadb-dump

В некоторых случаях или на некоторых платформах, когда CONNECT настроен для использования с типами таблиц JDBC, это приводит к тому, что mariadb-dump с опцией --all-databases завершается неудачно.

Об этом сообщил Роберт Дайас, который обнаружил причину и способ устранения (см. MDEV-11238).

Это происходит, когда включён «Отслеживатель использования» Java JRE. В этом случае Java создаёт каталог #mysql50#.oracle_jre_usage в каталоге данных MySQL, который отображается как база данных, но к которому невозможно получить доступ через MySQL Workbench, а также, по-видимому, он не резервируется с помощью mariadb-dump --all-databases.

Согласно документации Oracle (https://docs.oracle.com/javacomponents/usage-tracker/overview/), «Отслеживатель использования» отключён по умолчанию. Он включается только при создании файла свойств <каталог JRE>/lib/management/usagetracker.properties. Оказывается, это НЕВЕРНО на некоторых платформах, так как файл по умолчанию существует при новой установке, и его существование включает отслеживатель использования.

Решение на CentOS 7 с JVM Oracle состоит в том, чтобы переименовать или удалить файл usagetracker.properties (чтобы отключить его), затем удалить созданную им ложную папку в каталоге базы данных MySQL, а затем перезапустить.

Например, следующее работает:

sudo mv /usr/java/default/jre/lib/management/management.properties /usr/java/default/jre/lib/management/management.properties.TRACKER-OFF
sudo reboot
sudo rm -rf  /var/lib/mysql/.oracle_jre_usage
sudo reboot

В этой коллекции столбец address — JSON-объект, а столбец grades — JSON-массив. В отличие от таблицы JSON, просто указание имени столбца без Jpath приводит к отображению JSON-представления столбцов. Например:

select name, address from resto limit 3;
name address
Morris Park Bake Shop {"building":"1007","coord":[-73.8561,40.8484], "street":"Morris ParkAve", "zipcode":"10462"}
Wendy'S {"building":"469","coord":[-73.9617,40.6629], "street":"Flatbush Avenue", "zipcode":"11225"}
Reynolds Restaurant {"building":"351","coord":[-73.9851,40.7677], "street":"West 57Street", "zipcode":"10019"}

Нотация MongoDB с точкой

Для адресации элементов внутри объектов или массивов укажите Jpath в синтаксисе MongoDB (если используется обнаружение, укажите соответствующую опцию Depth):

От Connect 1.7.0002

create table newresto (
_id varchar(24) not null,
name varchar(64) not null,
cuisine char(200) not null,
borough char(16) not null,
street varchar(65) jpath='address.street',
building char(16) jpath='address.building',
zipcode char(5) jpath='address.zipcode',
grade char(1) jpath='grades.0.grade',
score int(4) not null jpath='grades.0.score', 
`date` date jpath='grades.0.date',
restaurant_id varchar(255) not null)
engine=connect table_type=MONGO tabname='restaurants'
data_charset=utf8 connection='mongodb://localhost:27017';

До Connect 1.7.0002

create table newresto (
_id varchar(24) not null,
name varchar(64) not null,
cuisine char(200) not null,
borough char(16) not null,
street varchar(65) field_format='address.street',
building char(16) field_format='address.building',
zipcode char(5) field_format='address.zipcode',
grade char(1) field_format='grades.0.grade',
score int(4) not null field_format='grades.0.score', 
`date` date field_format='grades.0.date',
restaurant_id varchar(255) not null)
engine=connect table_type=MONGO tabname='restaurants'
data_charset=utf8 connection='mongodb://localhost:27017';

Если этого не сделать, JVM Oracle запустит отслеживатель использования, который создаст скрытую папку .oracle_jre_usage в домашнем каталоге MySQL, что приведёт к сбою mariadb-dump сервера.

select name, street, score, date from newresto limit 5;
name street score date
Morris Park Bake Shop Morris Park Ave 2 03/03/2014
Wendy'S Flatbush Avenue 8 30/12/2014
Dj Reynolds Pub And Restaurant West 57 Street 2 06/09/2014
Riviera Caterer Stillwell Avenue 5 10/06/2014
Tov Kosher Kitchen 63 Road 20 24/11/2014

Специальные опции MONGO

Синтаксис MongoDB для Jpath не позволяет использовать специфичные для CONNECT элементы в массивах. Тот же эффект можно получить другим способом. Для этого используются дополнительные опции при создании таблиц MONGO.

Опция Тип Описание
Colist Строка Опции для передачи в курсор MongoDB.
Filter Строка Запрос, используемый курсором MongoDB.
Pipeline* Булево Если True, Colist — это конвейер.
Fullarray* Булево Используется при создании с обнаружением.
Driver* Строка C или Java.
Version* Целое число Версия драйвера Java (по умолчанию 3).
  • : Указывается в списке опций.

Примечание: Для содержимого этих опций обратитесь к документации MongoDB.

Опция Colist

Используется для передачи различных опций при создании курсора MongoDB, используемого для извлечения документов сортировки. Одна из них — проекция, позволяющая ограничить извлекаемые элементы в документах. Она мало полезна, поскольку это ограничение выполняется автоматически CONNECT. Однако она может использоваться при использовании обнаружения для исключения столбца _id (или другого), если вы не хотите его сохранять:

create table restest
engine=connect table_type=MONGO tabname='restaurants'
data_charset=utf8 option_list='depth=-1'
colist='{"projection":{"_id":0},"limit":5}';

В этом примере мы добавили ещё одну опцию курсора — опцию limit, которая работает как оператор limit SQL.

Эта дополнительная опция работает только с драйвером C. При использовании драйвера Java colist должен быть:

colist='{"_id":0}';

А limit будет указан в операторах select.

Примечание: При использовании с таблицей JSON для указания списка проекций (или «all» для получения всех столбцов) JPATH становится путями Connect JSON, а не MongoDB, что позволяет использовать опции JPATH, недоступные для MongoDB.

Опция Filter

Эта опция используется для указания «фильтра», который работает как оператор where в таблице. Предположим, мы хотим создать таблицу, ограниченную ресторанами, готовящими еду на английском языке, которые не находятся в районе Манхэттен, мы можем сделать это так:

create table english
engine=connect table_type=MONGO tabname='restaurants'
data_charset=utf8
colist='{"projection":{"cuisine":0}}'
filter='{"cuisine":"English","borough":{"$ne":"Manhattan"}}'
option_list='Depth=-1';

И если мы запросим:

select * from english;

Этот запрос вернёт:

_id borough name restaurant_id
58ada47de5a51ddfcd5ee1f3 Brooklyn The Park Slope Chipshop 40816202
58ada47de5a51ddfcd5ee999 Brooklyn Chip Shop 41076583
58ada47ee5a51ddfcd5f13d5 Brooklyn The Monro 41660253
58ada47ee5a51ddfcd5f176e Brooklyn Dear Bushwick 41690534
58ada47ee5a51ddfcd5f1e91 Queens Snowdonia Pub 50000290

Опция Pipeline

При указании этой опции как true (через YES или 1), опция Colist содержит конвейер MongoDB, применяемый к сортировке таблицы. Это мощный способ выполнения операций, таких как расширение массивов, как мы делаем с таблицами JSON. Например:

create table resto2 (
name varchar(64) not null,
borough char(16) not null,
date datetime not null,
grade char(1) not null,
score int(4) not null)
engine=connect table_type=MONGO tabname='restaurants' data_charset=utf8
colist='{"pipeline":[{"$match":{"cuisine":"French"}},{"$unwind":"$grades"},{"$project":{"_id":0,"name":1,"borough":1,"date":"$grades.date","grade":"$grades.grade","score":"$grades.score"}}]}'
option_list='Pipeline=1';

В этом конвейере «$match» — это ранний фильтр, «$unwind» означает, что массив grades будет расширен (один документ на каждое значение массива), а «$project» удаляет столбцы _id и cuisine и даёт Jpath для столбцов date, grade и score.

select name, grade, score, date from resto2
where borough = 'Bronx';

Этот запрос отвечает:

Название Оценка Счёт Дата
Bistro Sk A 10 21/11/2014 01:00:00
Bistro Sk A 12 19/02/2014 01:00:00
Bistro Sk B 18 12/06/2013 02:00:00

Это позволяет получить такие вещи, как мы делаем с таблицами JSON:

select name, avg(score) average from resto2
group by name having average >= 25;

Можно использовать для получения среднего балла внутри массива оценок.

Название Среднее значение
Bouley Botanical 25,0000
Cheri 46,0000
Graine De Paris 30,0000
Le Pescadeux 29,7500

Вариант Fullarray

Этот вариант, как и вариант Глубина, интерпретируется только при создании таблицы с помощью Discovery (то есть, без указания столбцов). Он сообщает CONNECT о генерации столбца для всех существующих значений в массиве. Например, давайте посмотрим на коллекцию MongoDB «tar»:

С Connect 1.7.0002

create table seetar (
Collection varchar(300) not null jpath='*')
engine=CONNECT table_type=MONGO tabname=tar;

До Connect 1.7.0002

create table seetar (
Collection varchar(300) not null field_format='*')
engine=CONNECT table_type=MONGO tabname=tar;

Формат «*» указывает, что мы хотим увидеть документы JSON. Эта небольшая коллекция:

Коллекция
{"_id":{"$oid":"58f63a5099b37d9c930f9f3b"},"item":"journal","prices":[87.0,45.0,63.0,12.0,78.0]}
{"_id":{"$oid":"58f63a5099b37d9c930f9f3c"},"item":"notebook","prices":[123.0,456.0,789.0]}

Вариант Fullarray может быть использован здесь для генерации достаточного количества столбцов, чтобы увидеть все цены из массива цен документа.

create table tar
engine=connect table_type=MONGO
colist='{"projection":{"_id":0}}'
option_list='depth=1,Fullarray=YES';

Таблица была создана как:

С Connect 1.7.0002

CREATE TABLE `tar` (
  `item` char(8) NOT NULL,
  `prices_0` double(12,6) NOT NULL `JPATH`='prices.0',
  `prices_1` double(12,6) NOT NULL `JPATH`='prices.1',
  `prices_2` double(12,6) NOT NULL `JPATH`='prices.2',
  `prices_3` double(12,6) DEFAULT NULL `JPATH`='prices.3',
  `prices_4` double(12,6) DEFAULT NULL `JPATH`='prices.4'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `COLIST`='{"projection":{"_id":0}}' `OPTION_LIST`='depth=1,Fullarray=YES';

До Connect 1.7.0002

CREATE TABLE `tar` (
  `item` char(8) NOT NULL,
  `prices_0` double(12,6) NOT NULL `FIELD_FORMAT`='prices.0',
  `prices_1` double(12,6) NOT NULL `FIELD_FORMAT`='prices.1',
  `prices_2` double(12,6) NOT NULL `FIELD_FORMAT`='prices.2',
  `prices_3` double(12,6) DEFAULT NULL `FIELD_FORMAT`='prices.3',
  `prices_4` double(12,6) DEFAULT NULL `FIELD_FORMAT`='prices.4'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `COLIST`='{"projection":{"_id":0}}' `OPTION_LIST`='level=1,Fullarray=YES';

И отображается как:

item prices_0 prices_1 prices_2 prices_3 prices_4
journal 87.00 45.00 63.00 12.00 78.00
notebook 123.00 456.00 789.00 NULL NULL

Операции создания, чтения, обновления и удаления

Все операции изменения поддерживаются. Однако вставка в массивы должна выполняться определенным образом. Как и с вариантом Fullarray, нам нужно иметь достаточно столбцов для указания значений массива. Например, мы можем создать новую таблицу:

С Connect 1.7.0002

create table testin (
n int not null,
m char(12) not null,
surname char(16) not null jpath='person.name.first',
name char(16) not null jpath='person.name.last',
age int(3) not null jpath='person.age',
price_1 double(8,2) jpath='d.0',
price_2 double(8,2) jpath='d.1',
price_3 double(8,2) jpath='d.2')
engine=connect table_type=MONGO tabname='tin'
connection='mongodb://localhost:27017';

До Connect 1.7.0002

create table testin (
n int not null,
m char(12) not null,
surname char(16) not null field_format='person.name.first',
name char(16) not null field_format='person.name.last',
age int(3) not null field_format='person.age',
price_1 double(8,2) field_format='d.0',
price_2 double(8,2) field_format='d.1',
price_3 double(8,2) field_format='d.2')
engine=connect table_type=MONGO tabname='tin'
connection='mongodb://localhost:27017';

Теперь можно заполнить ее:

insert into testin values
(1789, 'Welcome', 'Olivier','Bertrand',56, 3.14, 2.36, 8.45),
(1515, 'Hello', 'John','Smith',32, 65.17, 98.12, NULL),
(2014, 'Coucou', 'Foo','Bar',20, -1.0, 74, 81356);

Результат будет:

n m Фамилия Имя Возраст цена_1 цена_2 цена_3
1789 Приветствие Оливье Бертранд 56 3,14 2,36 8,45
1515 Привет Джон Смит 32 65,17 98,12 NULL
2014 Куку Фу Бар 20 -1 74 81356

Примечание: Если коллекция еще не существует при создании таблицы и вставке в нее, MongoDB создает ее автоматически.

Её можно обновить запросами, например:

update tintin set price_3 = 83.36 where n = 2014;

Чтобы посмотреть, как генерируется массив, давайте создадим другую таблицу:

С Connect 1.7.0002

create table tintin (
n int not null,
name char(16) not null jpath='person.name.first',
prices varchar(255) jpath='d')
engine=connect table_type=MONGO tabname='tin';

До Connect 1.7.002

create table tintin (
n int not null,
name char(16) not null field_format='person.name.first',
prices varchar(255) field_format='d')
engine=connect table_type=MONGO tabname='in';

Эта таблица отображается как:

С Connect 1.7.0002

n Имя Цены
1789 Оливье [3.1400000000000001243,2.3599999999999998757,8.4499999999999992895]
1515 Джон [65.170000000000001705,98.120000000000004547,null]
2014 Фу [null,74.0,83.359999999999999432]

До Connect 1.7.002

n Имя Цены
1789 Оливье [3.14, 2.36, 8.45]
1515 Джон [65.17, 98.12]
2014 Фу [<null>, 74.0, 83.36]

Примечание: Эту последнюю таблицу можно использовать для расчётов с массивами, как с таблицами JSON, используя функции JSON UDF. Например:

select name, jsonget_real(prices,'[+]') sum_prices, jsonget_real(prices,'[!]') avg_prices from tintin;

Этот запрос возвращает:

Имя сумма_цен среднее_цен
Оливье 13.95 4.65
Джон 163.29 81.64
Фу 157,36 78.68

Примечание: При расчётах с массивами значения NULL игнорируются.

Статус типа таблицы MONGO

Этот тип таблицы все ещё находится в разработке. Он имеет значительные преимущества по сравнению с типом JSON для доступа к коллекциям MongoDB. Во-первых, прямой доступ обеспечивает, что таблицы всегда актуальны, независимо от того, была ли коллекция изменена другим приложением. С точки зрения производительности, он может быть быстрее, чем JSON, потому что большая часть обработки выполняется MongoDB над BSON — его внутренней формой представления данных JSON, которая оптимизирована для всех операций. Обратите внимание, что использование MongoDB C Driver может быть быстрее, чем использование MongoDB Java Driver.

Текущие ограничения

  • Вариант «CATFUNC=tables» пока не реализован.
  • Варианты SRCDEF и EXECSRC не применяются к таблицам MONGO.
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-mongo-table-type/

Spec-Zone.ru

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