|
| 1 | +# Работа с базами данных MongoDB |
| 2 | + |
| 3 | +В этом разделе приведена основная информация о работе с внешней NoSQL-базой данных [MongoDB](https://www.mongodb.com/). |
| 4 | + |
| 5 | +Для работы с внешней базой данных MongoDB необходимо выполнить следующие шаги: |
| 6 | + |
| 7 | +1. Создать [секрет](../datamodel/secrets.md), содержащий пароль для подключения к базе данных. |
| 8 | + |
| 9 | + ```yql |
| 10 | + CREATE OBJECT mongodb_datasource_user_password (TYPE SECRET) WITH (value = "<password>"); |
| 11 | + ``` |
| 12 | +
|
| 13 | +1. Создать [внешний источник данных](../datamodel/external_data_source.md), описывающий целевую базу данных внутри кластера MongoDB. Для соединения с MongoDB используется [нативный TCP-протокол](https://www.mongodb.com/docs/manual/reference/mongodb-wire-protocol/) (`PROTOCOL="NATIVE"`). Параметр `LOCATION` содержит сетевой адрес экземпляра MongoDB, к которому осуществляется подключение. В `DATABASE_NAME` указывается имя базы данных (например, `master`). Для аутентификации во внешнюю базу используются значения параметров `LOGIN` и `PASSWORD_SECRET_NAME`. Включить шифрование соединений с внешней базой данных можно с помощью параметра `USE_TLS="TRUE"`. |
| 14 | +
|
| 15 | + Параметр `READING_MODE` определяет то, каким образом документ из MongoDB будет представлен в реляционном формате: опция `TABLE` подразумевает отображение каждого корневого поля документа в отдельную колонку таблицы. |
| 16 | +
|
| 17 | + В параметре `UNSUPPORTED_TYPE_DISPLAY_MODE` указывается политика обработки типов данных MongoDB, которые пока не поддерживаются в {{ ydb-full-name }}. Можно выбрать один из двух вариантов: в случае `UNSUPPORTED_OMIT` поля неподдерживаемых типов будут пропущены в результате запроса, а с `UNSUPPORTED_AS_STRING` запрос вернёт значение подобных полей в сериализованном виде как тип `Utf8`. Подробнее о том, как система типов MongoDB отображается в {{ ydb-full-name }}, можно прочитать в разделе [«Поддерживаемые типы данных»](#supported-data-types). |
| 18 | +
|
| 19 | + Опция `UNEXPECTED_TYPE_DISPLAY_MODE` отвечает за представление значений, которые оказались несовместимы с выведенной структурой документов MongoDB. При чтении данных из внешнего источника MongoDB {{ ydb-full-name }} автоматически выводит структуру документов коллекции с помощью небольшого скана. Поскольку данные MongoDB неструктурированы, отдельные документы коллекции могут не соответствовать полученной схеме. С опцией `UNEXPECTED_AS_NULL` подобные поля будут пропускаться вне зависимости от выведенного типа, а с опцией `UNEXPECTED_AS_STRING` значения полей неприводимых типов будут сериализованы в строки `Utf8`, если ожидаемый тип подобных полей в выведенной схеме — `Utf8`. |
| 20 | +
|
| 21 | + ```yql |
| 22 | + CREATE EXTERNAL DATA SOURCE mongodb_datasource WITH ( |
| 23 | + SOURCE_TYPE="MongoDB", |
| 24 | + LOCATION="<host>:<port>", |
| 25 | + DATABASE_NAME="<database>", |
| 26 | + AUTH_METHOD="BASIC", |
| 27 | + LOGIN="<login>", |
| 28 | + PASSWORD_SECRET_NAME="mongodb_datasource_user_password", |
| 29 | + USE_TLS="TRUE", |
| 30 | + READING_MODE="TABLE", |
| 31 | + UNSUPPORTED_TYPE_DISPLAY_MODE="UNSUPPORTED_OMIT", |
| 32 | + UNEXPECTED_TYPE_DISPLAY_MODE="UNEXPECTED_AS_NULL" |
| 33 | + ); |
| 34 | + ``` |
| 35 | +
|
| 36 | +1. {% include [!](_includes/connector_deployment.md) %} |
| 37 | +1. [Выполнить запрос](#query) к базе данных. |
| 38 | +
|
| 39 | +## Синтаксис запросов {#query} |
| 40 | +
|
| 41 | +Для работы с MongoDB используется следующая форма SQL-запроса: |
| 42 | +
|
| 43 | +```yql |
| 44 | +SELECT * FROM mongodb_datasource.<collection_name> |
| 45 | +``` |
| 46 | + |
| 47 | +где: |
| 48 | + |
| 49 | +- `mongodb_datasource` - идентификатор внешнего источника данных; |
| 50 | +- `<collection_name>` - имя коллекции внутри внешнего источника данных. |
| 51 | + |
| 52 | +## Ограничения |
| 53 | + |
| 54 | +При работе с кластерами MongoDB существует ряд ограничений: |
| 55 | + |
| 56 | +1. {% include [!](_includes/supported_requests.md) %} |
| 57 | +1. {% include [!](_includes/predicate_pushdown.md) %} |
| 58 | + |
| 59 | + |Тип данных {{ ydb-short-name }}| |
| 60 | + |----| |
| 61 | + |`Bool`| |
| 62 | + |`Int8`| |
| 63 | + |`Uint8`| |
| 64 | + |`Int16`| |
| 65 | + |`Uint16`| |
| 66 | + |`Int32`| |
| 67 | + |`Uint32`| |
| 68 | + |`Int64`| |
| 69 | + |`Uint64`| |
| 70 | + |`Float`| |
| 71 | + |`Double`| |
| 72 | + |`String`| |
| 73 | + |`Utf8`| |
| 74 | + |
| 75 | +## Поддерживаемые типы данных {#supported-data-types} |
| 76 | + |
| 77 | +MongoDB — это NoSQL-СУБД, предназначенная для работы с неструктурированными и полуструктурированными данными. В отличие от реляционных баз данных, MongoDB хранит JSON-подобные документы, которые, как правило, не соответствуют единому формату или структуре. В связи с этим для преобразования данных MongoDB в реляционный формат, необходимый для выполнения SQL-запросов, {{ ydb-full-name }} автоматически выводит схему MongoDB при выполнении запроса с помощью небольшого сканирования коллекции. В случае обработки документов, в которых одинаковые поля представлены разными неприводимыми типами (например, `Int32` и `String`), они будут представлены в запросе в сериализованном виде, а тип {{ ydb-full-name }} для них будет соответствовать `Optional<Utf8>`. |
| 78 | + |
| 79 | +Любые поля MongoDB, кроме `_id`, по умолчанию могут быть опущены или содержать значения `NULL`, и в системе типов {{ ydb-full-name }} они должны отображаться в [опциональные](../../yql/reference/types/optional.md) типы. Поскольку поле `_id` в разных документах одной коллекции может иметь разные типы, в системе типов {{ ydb-full-name }} оно также будет опциональным. |
| 80 | + |
| 81 | +Ниже приведена таблица соответствия типов MongoDB и {{ ydb-short-name }}. Все остальные типы данных, за исключением перечисленных, не поддерживаются и не могут быть использованы в пушдауне предикатов. Однако поля таких типов всё ещё могут использоваться в качестве возвращаемого значения запроса в сериализованном виде как `Optional<Utf8>` при включении параметра `UNSUPPORTED_TYPE_DISPLAY_MODE=UNSUPPORTED_AS_STRING`. |
| 82 | + |
| 83 | +|Тип данных MongoDB|Тип данных {{ ydb-full-name }} |
| 84 | +|---|---| |
| 85 | +|`Boolean`|`Optional<Bool>`| |
| 86 | +|`Int32`|`Optional<Int32>`| |
| 87 | +|`Int64`|`Optional<Int64>`| |
| 88 | +|`Double`|`Optional<Double>`| |
| 89 | +|`String`|`Optional<Utf8>`| |
| 90 | +|`Binary`|`Optional<String>`| |
| 91 | +|`ObjectId`|`Optional<String>`| |
0 commit comments