MongoDB 커넥터

MongoDB 커넥터 (MongoDB connector)

MongoDB 커넥터는 Trino 쿼리에서 MongoDB 컬렉션의 데이터를 읽고 쓸 수 있게 해줍니다. MongoDB의 데이터를 다른 데이터 소스와 하나의 쿼리로 조합하거나, MongoDB 컬렉션을 마치 Trino 테이블처럼 다룰 수 있어요.

출처: 문서

본문

요구 사항 (Requirements)

MongoDB에 연결하려면 다음이 필요합니다:

  • MongoDB 서버 (3.4 이상).
  • Trino 코디네이터와 워커에서 MongoDB로의 네트워크 접근.

설정 (Configuration)

MongoDB 커넥터를 example 카탈로그로 설정하려면 etc/catalogexample.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 DESCRIBESELECT *에서 컬럼을 숨길지 여부. 기본값은 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 커넥터로 다른 데이터 소스와 데이터를 조합해보세요. 커넥터의 일반적인 개념은 커넥터 개요 문서에서 확인할 수 있어요.