문서 관계형 정의 언어
문서 관계형 정의 언어(DRDL
)는 MongoDB 스키마의 관계형 뷰를 정의합니다.
mongodrdl
는 MongoDB collection에서 문서를 샘플링하고 해당 문서에서 DRDL
파일을 파생합니다. 그런 다음 mongosqld
은(는) DRDL
파일에 정의된 스키마를 사용하여 MySQL 클라이언트가 MongoDB 데이터를 쿼리할 수 있도록 허용합니다.
파일 형식
파일은 DRDL
YAML 의 데이터베이스, 테이블 및 열을 나열합니다. 형식.
schema: - db: <database name> tables: - table: <SQL table name> collection: <MongoDB collection name> pipeline: - <optional pipeline elements> columns: - Name: <MongoDB field name> MongoType: <MongoDB field type> SqlName: <mapped SQL column name> SqlType: <mapped SQL column type>
예시
test
데이터베이스의 abc
컬렉션에 다음과 같은 형태의 문서가 주어집니다:
{ "_id": ObjectId(), "close": 7.45, "detail": { "a": 2, "b": 3 } }
mongodrdl
를 실행하여 이 collection을 기반으로 스키마를 생성합니다.
mongodrdl -d test -c abc -o schema.drdl
생성된 스키마 파일(schema.drdl
)은 다음과 유사하게 표시됩니다:
schema: - db: test tables: - table: abc collection: abc pipeline: [] columns: - Name: _id MongoType: bson.ObjectId SqlName: _id SqlType: varchar - Name: close MongoType: float64 SqlName: close SqlType: numeric - Name: detail.a MongoType: float64 SqlName: detail.a SqlType: numeric - Name: detail.b MongoType: float64 SqlName: detail.b SqlType: numeric
필드 유형
BI Connector는 항상 동일한 데이터 유형을 포함하는 필드를 관계형 모델에 매핑합니다. 스키마 생성은 특히 다음과 같은 경우를 다룹니다.
숫자 | BI Connector는 샘플링된 문서와 일치하는 가장 정확한 숫자 유형을 사용합니다. collection의 필드에 항상 동일한 데이터 유형이 있는 경우 BI Connector는 해당 유형을 사용합니다. collection의 필드에 부동 소수점 값이나 정수가 포함될 수 있는 경우 BI Connector는 |
날짜 | |
타임스탬프 | BI Connector는 data_timestamp 유형의 모든 필드를 무시합니다. |
ObjectID | BI Connector는 data_oid 유형의 모든 필드를 SQL 유형 varchar 로 취급합니다. |
UUID | BI Connector는 UUID 유형의 모든 필드를 SQL 유형 varchar 으로 취급합니다. |
지리 공간 | 컬렉션에 지리 공간적 인덱스 가 포함된 경우 BI Connector는 인덱싱된 필드를 숫자 경도-위도 좌표 배열에 매핑합니다. 예는 지리 공간적 데이터 를 참조하세요. BI Connector는 뷰에서 읽을 때 지리 공간적 필드를 인식하지 못합니다. |
이기종 필드 | 필드에 일치하지 않는 유형이 포함된 경우 BI Connector는 가장 자주 샘플링된 유형을 선택합니다. 필드에 해당 유형의 유형 또는 배열이 포함될 수 있는 경우, 생성된 스키마는 항상 필드에 배열이 포함되도록 지정합니다. 학습 내용은 DRDL 유형 정의와 호환되지 않는 데이터를 건너뛰는 방법을 참조하세요. |
내장된 문서
BI Connector는 내장된 문서를 .
구분 문자가 있는 단순한 필드에 매핑하여 MongoDB 쿼리에서 점 표기법을 사용해 참조하는 방식과 유사하게 보이도록 합니다.
Tableau 는 식별자를 올바르게 따옴표로 묶지만, 임시 SQL 표현식 내에서는 .
자 또는 대소문자 혼합 문자가 포함된 모든 식별자를 큰따옴표로 묶어야 합니다.
예시
다음 문서를 살펴보세요.
{ "_id": 1, "familyName": "Partridge", "hometown" : "Hollywood Hills", "address" : { "street": "123 Main Street", "city" : "Hollywood", "state" : "CA", "zip" : "90210" }, "members_since" : ISODate("2002-04-12T00:00:00Z") }
이 문서가 포함된 collection에서 mongodrdl
를 실행하면 생성된 스키마에 다음 필드가 생성됩니다.
_id | numeric |
familyName | varchar |
hometown | varchar |
address.street | varchar |
address.city | varchar |
address.state | varchar |
address.zip | varchar |
members_since | timestamp |
배열
BI Connector는 배열이 없는 collection과 배열 요소당 문서가 하나씩 있는 collection, 이렇게 두 collection을 사용하여 비즈니스 인텔리전스 도구에 배열을 노출합니다.
예시
다음 문서가 포함된 families
이라는 컬렉션에서 mongodrdl
를 실행하는 경우:
{ "_id": 1, "familyName": "Partridge", "hometown" : "Hollywood Hills", "familyMembers" : [ { "firstname" : "Shirley", "age" : 42, "attributes" : [ { "name" : "instrument", "value" : "singer" }, { "name" : "role", "value" : "mom" } ] }, { "firstname" : "Keith", "age" : 18, "attributes" : [ { "name" : "instrument", "value" : "guitar" }, { "name" : "role", "value" : "son" } ] }, { "firstname" : "Laurie", "age" : 16, "attributes" : [ { "name" : "instrument", "value" : "keyboard" }, { "name" : "role", "value" : "sister" } ] }] }
그 결과 다음과 같은 세 개의 테이블이 생성됩니다.
families
_id
numeric
familyName
varchar
hometown
varchar
families_familyMembers
_id
numeric
familyMembers.age
numeric
familyMembers.firstname
varchar
familyMembers_idx
numeric
families_familyMembers_attributes
_id
numeric
familyMembers.attributes.name
varchar
familyMembers.attributes.value
varchar
familyMembers.attributes_idx
numeric
familyMembers_idx
numeric
이러한 테이블을 함께 조인하여 비정규화된 형식으로 데이터를 볼 수 있습니다. 예를 들어, 다음 쿼리를 사용하여 위의 스키마에 이름이 지정된 사람들을 해당 가족 정보와 함께 나열할 수 있습니다.
SELECT f.*, m.`familyMembers.firstname` FROM families_familyMembers m JOIN families f ON m._id = f._id;
사전 조인
--preJoined
에 옵션을 제공하면 BI Connector는 포함 문서의 필드를 각 배열 요소의 문서에 추가하여 테이블을 "사전 조인"합니다.mongodrdl
이전 예의 경우 테이블에 다음과 같은 추가 열이 포함됩니다.
families_familyMembers
familyName
varchar
hometown
varchar
families_familyMembers_attributes
familyMembers.age
numeric
familyMembers.firstname
varchar
familyMembers_idx
numeric
familyName
varchar
hometown
varchar
사용자 지정 필터
DRDL
파일 의 컬렉션 에 mongo.Filter
유형의 열을 추가할 수 있습니다. 이 열 유형을 사용하면 사용자 지정 $match 쿼리 를 수행할 수 있습니다.
예를 들어, 최대 3개의 구성 요소로 구성된 점 cloud를 설명하는 다음 스키마가 있다고 가정해 보겠습니다.
schema: - db: test tables: - table: points collection: points pipeline: [] columns: - Name: _id MongoType: bson.ObjectId SqlName: _id SqlType: varchar - Name: x MongoType: float64 SqlName: x SqlType: numeric - Name: "y" MongoType: float64 SqlName: "y" SqlType: numeric - Name: z MongoType: float64 SqlName: z SqlType: numeric - Name: filter MongoType: mongo.Filter SqlName: filter SqlType: varchar
다음 쿼리를 사용하여 3차원 점만 선택할 수 있습니다.
SELECT x, y, z FROM points WHERE filter='{"z": {"$exists": true}}';
집계 파이프라인
뷰를 사용한 집계 파이프라인
MongoDB 3.4 에는 호환되지 않는 데이터를 필터링하는 데 사용할 수 있는 읽기 전용 뷰 가 도입되었습니다.
예를 들어, grades
collection의 grade
필드에 숫자가 포함된 문서만 포함하는 test
데이터베이스에 뷰를 만들 수 있습니다.
db.runCommand( { create: "numericGrades", viewOn: "grades", pipeline: [ { "$match": { "grade": { "$type": "number" } } } ] } )
그런 다음 mongodrdl
를 사용하여 collection을 생성하는 것처럼 이 뷰에서 스키마를 생성할 수 있습니다.
mongodrdl -d test -c numericGrades
DRDL의 집계 파이프라인
BI Connector는 집계 파이프라인을 스키마의 일부로 사용하여 컬렉션의 문서를 관계형 테이블에 적합한 형식으로 변환할 수 있습니다.
예를 들어 simpleFamilies
컬렉션의 간단한 문서를 가정해 보겠습니다.
{ "_id": 1, "familyName": "Partridge", "familyMembers" : [ "Shirley", "Keith", "Laurie"] }
mongodrdl
는 simpleFamilies
및 simpleFamilies_familyMembers
테이블이 있는 스키마를 생성합니다.
simpleFamilies_familyMembers
테이블에는 각 패밀리 멤버가 열거되며 다음과 같은 파이프라인이 있습니다.
pipeline: - $unwind: includeArrayIndex: familyMembers_idx path: $familyMembers
이 파이프라인 은 $unwind
를 사용하여 familyMembers
의 각 멤버에 대한 새 기록 를 생성합니다. 스키마 는 familyMembers_idx
필드 의 배열 인덱스 를 추적합니다.
지리 공간 데이터
컬렉션에 2d
또는 2dsphere
지리 공간적 인덱스 가 포함된 경우 BI Connector는 인덱싱된 필드를 숫자 경도-위도 좌표 배열에 매핑합니다.
예시
다음 collection이 주어집니다:
db.points.createIndex( { pos : "2dsphere" } ) db.points.insertOne({ pos : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Parks" })
BI Connector는 다음 스키마를 생성합니다.
schema: - db: test tables: - table: points collection: points pipeline: [] columns: - Name: _id MongoType: bson.ObjectId SqlName: _id SqlType: varchar - Name: category MongoType: string SqlName: category SqlType: varchar - Name: name MongoType: string SqlName: name SqlType: varchar - Name: pos.coordinates MongoType: geo.2darray SqlName: pos.coordinates SqlType: numeric[]
BI Connector는 뷰에서 읽을 때 지리 공간적 필드를 인식하지 못합니다.