19 декабря 2024

Доступ к базе данных MongoDB через ODBC

До вчерашнего дня мои знания о MongoDB ограничивались тем, что в мире есть такая документоориентированная NoSQL СУБД. Но меня спросили "Мы можем из проприетарной системы, которая стоит у заказчика, прочитать информацию из базы данных MongoDB?". Эта система, кроме коннекторов к различным реляционным СУБД, имеет возможность работать с данными через ODBC. Поэтому мой ответ был: "Если у MongoDB есть ODBC-драйвер, то да". Я скачал и установил на сервер MongoDB Community Edition, создал тестовую базу данных и в ней коллекцию (это так в MongoDB обозвали таблицы). Дальше начались трудности. На сайте СУБД ODBC Driver был только в разделе "Atlas SQL Interface". После того как с этим драйвером мне не удалось подключиться к тестовой БД, я почитал и узнал, что MongoDB Atlas – это облачный вариант СУБД. То есть для поставленной задачи этот драйвер не подходит. Google сразу подсунул мне ссылки на ODBC-драйвера от Devart и CData Software. Обе компании известны своими качественными продуктами для доступа к базам данных (мое почтение программистам Devart за UniDAC), но их драйвера платные, а значит – мне они не подходят.

Поиски бесплатного ODBC-драйвера для MongoDB привели меня на GitHub. Там я нашел MongoDB BI Connector ODBC Driver – ODBC-драйвер для подключения из приложения к MongoDB Connector for Business Intelligence (MongoDB Connector for BI или MongoDB BI Connector). MongoDB Connector for BI – это специальное приложение, которое "позволяет использовать вашу BI-систему для визуализации, изучения и составления отчетов по данным MongoDB с использованием стандартных SQL-запросов". То есть, это посредник между SQL-клиентом и сервером MongoDB, который принимает входящие SQL-запросы, транслирует их в MQL (MongoDB Query Language) и перенаправляет серверу MongoDB, а в ответ от сервера MongoDB получает JSON с данными, который преобразует и возвращает SQL-клиенту. Вот такой подземный ход на чердак: Приложение -> ODBC- драйвер -> BI Connector -> MongoDB:

Приложение -> ODBC- драйвер -> BI Connector -> MongoDB
Мне кажется, что наименование "BI Connector" звучит как-то ограничивающе область применения, и более подходящим наименованием было бы "SQL Connector". Чем руководствовались менеджеры проекта при выборе его наименования я не знаю. Но, независимо от названия, мне такой вариант подключения к MongoDB подходит.

Для начала на сервере с MongoDB необходимо установить и настроить MongoDB Connector for BI. Его инсталлятор содержит два исполняемых модуля:

  • mongosqld – сам MongoDB Connector for BI.
  • mongodrdl – утилита, которая генерирует информацию о схеме базы данных MongoDB (она нам тоже пригодится).
Минимально необходимых для работы MongoDB Connector for BI настроек не много. В каталоге, используемом для установки, находим шаблон конфиг файла «example-mongosqld-config.yml», копируем его в новый файл и вносим всего две правки:
  1. Что бы к MongoDB Connector for BI можно было подключиться с рабочей станции в параметр net.bindIp к 127.0.0.1 через запятую добавляем IP адрес сервера MongoDB.
  2. MongoDB Connector for BI для своей работы требует схему базы данных MongoDB. Для начала настроим параметр schema.stored так, чтобы она генерировалась автоматически (ниже, "fp" – это наименование базы данных MongoDB).
Изменения в конфигурационном файле MongoDB Connector for BI с DRDL-схемой в базе данных
После запуска mongosqld в указанной в конфигурационном файле базе данных появятся две новые коллекции "names" и "schemas":
DRDL-схема базы данных в MongoDBCompass
Так как у меня планируется подключение к базе данных сторонней информационной системы, то "не красиво" создавать в ней свои таблицы. Есть способ обойтись без них. Для этого:
  1. с помощью утилиты mongodrdl выгрузим схему базы данных в файл формата DRDL
    mongodrdl /db:fp /out:fp.drdl
    Содержимое полученного файла fp.drdl напоминает содержимое коллекции schemas при автогенерации схемы:
    schema:
    - db: fp
      tables:
      - table: regions
        collection: regions
        pipeline: []
        columns:
        - Name: _id
          MongoType: bson.ObjectId
          SqlName: _id
          SqlType: objectid
        - Name: Id
          MongoType: int
          SqlName: Id
          SqlType: int
        - Name: Name
          MongoType: string
          SqlName: Name
          SqlType: varchar
        - Name: ParentId
          MongoType: int
          SqlName: ParentId
          SqlType: int
  2. в конфигурационном файле вместо секции schema.stored заполним названием DRDL-файла параметр schema.path:
    Изменения в конфигурационном файле MongoDB Connector for BI с использованием DRDL-файла
Теперь, на рабочую станцию устанавливаем MongoDB BI Connector ODBC Driver и создаем с ним источник данных ODBC:
MongoDB ODBC Data Source Configuration
Я хотел бы обратить ваше внимание на параметр источника данных "port". В нем указывается не порт сервера MongoDB (27017), а порт MongoDB Connector for BI (3307).

В заключение покажу, как выглядят данные полученные из коллекции regions БД MongoDB в системе, для которой я настраивал подключение через ODBC:

Данные полученные из MongoDB через ODBC
Слева – так система видит коллекцию, справа – результат выполнения запроса к коллекции "SELECT ID, name, ParentId FROM regions".

Комментариев нет:

Отправить комментарий