CONNECT MONGO Тип таблицы: Доступ к коллекциям из MongoDB
Классифицированная как программа базы данных NoSQL, MongoDB использует документы, похожие на JSON (BSON), сгруппированные в коллекции. Тип MONGO используется для прямого доступа к коллекциям MongoDB как к таблицам.
Доступ к MongoDB из CONNECT
Доступ к MongoDB из CONNECT можно осуществить различными способами:
- В качестве таблицы MONGO через драйвер MongoDB C.
- В качестве таблицы MONGO через драйвер MongoDB Java.
- В качестве таблицы JDBC, используя некоторые коммерческие драйверы JDBC для MongoDB.
- В качестве таблицы JSON через драйвер MongoDB C или Java.
Использование драйвера MongoDB C
В настоящее время это недоступно из бинарных дистрибутивов, а только для версий, скомпилированных из исходного кода. Предпочтительная версия драйвера MongoDB C — 1.7, поскольку они обеспечивают распознавание пакетов. Необходимо выполнить следующие действия:
- Установить libbson и драйвер MongoDB C 1.7.
- Настроить, скомпилировать и установить MariaDB.
В более ранних версиях драйвера Mongo C дополнительные каталоги включаемых файлов и библиотеки необходимо будет указать вручную при компиляции.
Если это возможно, это предпочтительный способ доступа, так как он не требует всех настроек пути Java и т. д. и быстрее, чем использование драйвера Java.
Использование драйвера Mongo Java
Это возможно со всеми дистрибутивами, включая поддержку JDBC, или при компиляции из исходного кода. С бинарным дистрибутивом, который не включает тип таблицы MONGO, можно получить доступ к MongoDB с помощью модуля OEM. Подробности см. в Примере таблицы CONNECT OEM. Дополнительные действия следующие:
- Установить драйвер MongoDB Java, скачав его файл jar. Доступно несколько версий. Если возможно, используйте последнюю версию 3.
- Добавить путь к нему в переменную среды 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.
© 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/