MongoDB 커넥터
MongoDB 커넥터 (MongoDB connector)
MongoDB 커넥터는 Trino 쿼리에서 MongoDB 컬렉션의 데이터를 읽고 쓸 수 있게 해줍니다. MongoDB의 데이터를 다른 데이터 소스와 하나의 쿼리로 조합하거나, MongoDB 컬렉션을 마치 Trino 테이블처럼 다룰 수 있어요.
출처: 문서
본문
요구 사항 (Requirements)
MongoDB에 연결하려면 다음이 필요합니다:
- MongoDB 서버 (3.4 이상).
- Trino 코디네이터와 워커에서 MongoDB로의 네트워크 접근.
설정 (Configuration)
MongoDB 커넥터를 example 카탈로그로 설정하려면 etc/catalog에 example.properties라는 파일을 만들고 다음 속성을 넣어주세요:
connector.name=mongodb
mongodb.connection-url=mongodb://user:[email protected]:27017/
mongodb.connection-url은 MongoDB에 연결하는 데 필요한 모든 연결 정보를 담는 MongoDB URI입니다. 연결 문자열 자체에 자격 증명이나 다른 보안 설정을 넣을 수 있고, 시크릿 (secrets)을 활용해 값을 숨길 수도 있습니다.
설정 속성 (Configuration properties)
| 속성 이름 | 설명 |
|---|---|
mongodb.connection-url |
MongoDB server URI. 필수. |
mongodb.schema-collection |
스키마 정의가 저장되는 특수 컬렉션 이름. 기본값은 _schema. |
mongodb.case-insensitive-name-matching |
대소문자 구분 없는 스키마/테이블 이름 지원 여부. 기본값은 false. |
mongodb.tls.enabled |
TLS 사용 여부. 기본값은 false. |
mongodb.tls.keystore-path |
TLS 클라이언트 인증용 키 스토어 경로. |
mongodb.tls.keystore-password |
키 스토어 비밀번호. |
mongodb.tls.truststore-path |
TLS 서버 검증용 트러스트 스토어 경로. |
mongodb.tls.truststore-password |
트러스트 스토어 비밀번호. |
mongodb.read-preference |
읽기 기본 설정 (read preference). PRIMARY, PRIMARY_PREFERRED, SECONDARY, SECONDARY_PREFERRED, NEAREST 값 지원. 기본값은 PRIMARY. |
mongodb.read-preference-tags |
태그 세트로 지정된 읽기 기본 설정. 기본값은 빈 목록. |
mongodb.allow-local-scheduling |
Trino와 MongoDB가 같은 클러스터를 공유할 때 특정 split을 같은 워커/MongoDB 노드에서 처리할지 여부. 기본값은 false. |
mongodb.dynamic-filtering.wait-timeout |
split 생성 중 동적 필터 완료 대기 시간. 기본값은 5s. |
mongodb.cursor-batch-size |
한 배치에서 반환되는 요소 수 제한. 기본값은 0. |
mongodb.connection-url
MongoDB 커넥터의 필수 속성으로, MongoDB server URI를 지정합니다. 예를 들어:
mongodb.connection-url=mongodb://root:[email protected]:27017/
mongodb.schema-collection
스키마 정의가 저장되는 특수 컬렉션입니다. 기본값은 _schema이며, 각 MongoDB 문서 컬렉션에 대한 Trino 테이블 정의를 담습니다.
mongodb.read-preference
MongoDB 복제본 세트에서 읽기 기본 설정을 제어합니다. 값은 PRIMARY, PRIMARY_PREFERRED, SECONDARY, SECONDARY_PREFERRED, NEAREST 중 하나여야 합니다.
mongodb.read-preference-tags
읽기 기본 설정에 적용할 태그 세트 목록입니다.
mongodb.allow-local-scheduling
Trino와 MongoDB가 같은 클러스터를 공유하고 특정 MongoDB split을 같은 워커와 MongoDB 노드에서 처리해야 할 때 true로 설정하세요. 공유 배포는 권장되지 않으며, 이 속성을 켜면 리소스 경합이 발생할 수 있습니다.
mongodb.dynamic-filtering.wait-timeout
split 생성 중 동적 필터 완료를 기다리는 시간입니다.
mongodb.cursor-batch-size
한 배치에서 반환되는 요소 수를 제한합니다. batchSize가 0이면 드라이버 기본값을 사용하고, 양수면 각 배치 크기, 음수면 최대 배치 크기(보통 4MB)에 맞는 객체 수를 제한하고 커서를 닫습니다. 배치 크기 1은 사용하지 마세요.
표 정의 (Table definition)
MongoDB는 mongodb.schema-collection 설정이 가리키는 특수 컬렉션에 테이블 정의를 유지합니다.
플러그인은 컬렉션이 삭제된 것을 감지할 수 없습니다. MongoDB Shell에서 db.getCollection("_schema").remove( { table: deleted_table_name })을 실행해 항목을 삭제해야 합니다. Trino에서는 DROP TABLE table_name으로 컬렉션을 삭제할 수도 있습니다.
스키마 컬렉션은 테이블 하나당 MongoDB 문서 하나로 구성됩니다:
{
"table": ...,
"fields": [
{ "name" : ...,
"type" : "varchar|bigint|boolean|double|date|array(bigint)|...",
"hidden" : false },
...
]
}
커넥터는 스키마를 자동 생성할 때 행 유형의 필드를 인용합니다. 다만 자동 생성된 스키마는 테이블의 정보와 일치하도록 컬렉션에서 수동으로 수정해야 합니다.
수동으로 수정한 필드는 명시적으로 인용해야 합니다. 예: row("UpperCase" varchar).
| 필드 | 필수 | 유형 | 설명 |
|---|---|---|---|
table |
필수 | string | Trino 테이블 이름 |
fields |
필수 | array | 필드 정의 목록. 각 필드 정의는 Trino 테이블에 새 컬럼을 만듭니다. |
각 필드 정의:
{
"name": ...,
"type": ...,
"hidden": ...
}
| 필드 | 필수 | 유형 | 설명 |
|---|---|---|---|
name |
필수 | string | Trino 테이블의 컬럼 이름 |
type |
필수 | string | 컬럼의 Trino 유형 |
hidden |
선택 | boolean | DESCRIBE와 SELECT *에서 컬럼을 숨길지 여부. 기본값은 false. |
ObjectId
MongoDB 컬렉션에는 특별한 _id 필드가 있습니다. 커넥터는 이 특수 필드에 대해 같은 규칙을 따르므로 숨겨진 _id 필드가 존재합니다.
CREATE TABLE IF NOT EXISTS orders (
orderkey BIGINT,
orderstatus VARCHAR,
totalprice DOUBLE,
orderdate DATE
);
INSERT INTO orders VALUES(1, 'bad', 50.0, current_date);
INSERT INTO orders VALUES(2, 'good', 100.0, current_date);
SELECT _id, * FROM orders;
_id | orderkey | orderstatus | totalprice | orderdate
-------------------------------------+----------+-------------+------------+------------
55 b1 51 63 38 64 d6 43 8c 61 a9 ce | 1 | bad | 50.0 | 2015-07-23
55 b1 51 67 38 64 d6 43 8c 61 a9 cf | 2 | good | 100.0 | 2015-07-23
(2 rows)
SELECT _id, * FROM orders WHERE _id = ObjectId('55b151633864d6438c61a9ce');
_id | orderkey | orderstatus | totalprice | orderdate
-------------------------------------+----------+-------------+------------+------------
55 b1 51 63 38 64 d6 43 8c 61 a9 ce | 1 | bad | 50.0 | 2015-07-23
(1 row)
_id 필드를 VARCHAR로 캐스팅하면 읽을 수 있는 값으로 렌더링할 수 있습니다:
SELECT CAST(_id AS VARCHAR), * FROM orders WHERE _id = ObjectId('55b151633864d6438c61a9ce');
_id | orderkey | orderstatus | totalprice | orderdate
---------------------------+----------+-------------+------------+------------
55b151633864d6438c61a9ce | 1 | bad | 50.0 | 2015-07-23
(1 row)
ObjectId 타임스탬프 함수 (ObjectId timestamp functions)
각 ObjectId의 첫 4바이트는 생성 시각의 임베디드 타임스탬프를 나타냅니다. Trino는 이 MongoDB 기능을 활용하는 두 가지 함수를 제공합니다.
objectid_timestamp(ObjectId) → timestamp
주어진 ObjectId에서 TIMESTAMP WITH TIME ZONE을 추출합니다:
SELECT objectid_timestamp(ObjectId('507f191e810c19729de860ea'));
-- 2012-10-17 20:46:22.000 UTC
timestamp_objectid(timestamp) → ObjectId
TIMESTAMP WITH TIME ZONE에서 ObjectId를 만듭니다:
SELECT timestamp_objectid(TIMESTAMP '2021-08-07 17:51:36 +00:00');
-- 61 0e c8 28 00 00 00 00 00 00 00 00
MongoDB에서는 2021-08-07 17:51:36 이후에 생성된 모든 문서를 다음처럼 필터링할 수 있습니다:
db.collection.find({"_id": {"$gt": ObjectId("610ec8280000000000000000")}})
Trino에서는 같은 작업을 이 쿼리로 수행할 수 있습니다:
SELECT *
FROM collection
WHERE _id > timestamp_objectid(TIMESTAMP '2021-08-07 17:51:36 +00:00');
장애 허용 실행 지원 (Fault-tolerant execution support)
커넥터는 쿼리 처리의 장애 허용 실행을 지원합니다. 어떤 재시도 정책으로든 읽기와 쓰기 연산 모두 지원됩니다.
데이터 유형 매핑 (Type mapping)
Trino와 MongoDB는 서로 지원하지 않는 유형이 있으므로, 이 커넥터는 데이터를 읽거나 쓸 때 일부 유형을 변환합니다. 각 방향의 매핑은 아래 표를 참고하세요.
MongoDB에서 Trino로의 유형 매핑:
| MongoDB 유형 | Trino 유형 | 비고 |
|---|---|---|
Boolean |
BOOLEAN |
|
Int32 |
BIGINT |
|
Int64 |
BIGINT |
|
Double |
DOUBLE |
|
Decimal128 |
DECIMAL(p, s) |
|
Date |
TIMESTAMP(3) |
|
String |
VARCHAR |
|
Binary |
VARBINARY |
|
ObjectId |
ObjectId |
|
Object |
ROW |
|
Array |
ARRAY |
요소 유형이 고유하지 않으면 ROW로 매핑 |
DBRef |
ROW |
그 외 유형은 지원되지 않습니다.
Trino에서 MongoDB로의 유형 매핑:
| Trino 유형 | MongoDB 유형 |
|---|---|
BOOLEAN |
Boolean |
BIGINT |
Int64 |
DOUBLE |
Double |
DECIMAL(p, s) |
Decimal128 |
TIMESTAMP(3) |
Date |
VARCHAR |
String |
VARBINARY |
Binary |
ObjectId |
ObjectId |
ROW |
Object |
ARRAY |
Array |
그 외 유형은 지원되지 않습니다.
SQL 지원 (SQL support)
커넥터는 MongoDB의 데이터와 메타데이터에 대해 읽기/쓰기 접근을 제공합니다. 전역 사용 가능 명령문과 읽기 연산 명령문에 더해 다음 기능을 지원합니다:
- INSERT
- DELETE
- CREATE TABLE
- CREATE TABLE AS
- DROP TABLE
- ALTER TABLE
- CREATE SCHEMA
- DROP SCHEMA
- COMMENT
ALTER TABLE
커넥터는 ALTER TABLE RENAME TO, ALTER TABLE ADD COLUMN, ALTER TABLE DROP COLUMN 연산을 지원합니다. 그 외 ALTER TABLE 사용은 지원되지 않습니다.
테이블 함수 (Table functions)
커넥터는 MongoDB에 접근하기 위한 특정 테이블 함수를 제공합니다.
query(database, collection, filter) -> table
query 함수는 연결된 MongoDB를 직접 조회하게 해줍니다. 전체 쿼리가 푸시다운되어 MongoDB에서 처리되므로 MongoDB 고유 문법이 필요합니다. Trino에 없는 네이티브 기능에 접근하거나, 네이티브 실행이 더 빠른 상황에서 쿼리 성능을 높일 때 유용합니다.
예를 들어 regionkey 필드가 0인 모든 행을 가져옵니다:
SELECT
*
FROM
TABLE(
example.system.query(
database => 'tpch',
collection => 'region',
filter => '{ regionkey: 0 }'
)
);
더 알아보기 (Learn more)
MongoDB 커넥터로 다른 데이터 소스와 데이터를 조합해보세요. 커넥터의 일반적인 개념은 커넥터 개요 문서에서 확인할 수 있어요.