ドキュメント関係定義言語
ドキュメント関係定義言語( DRDL
)は、MongoDB スキーマのリレーショナルビューを定義します。
mongodrdl
は MongoDB コレクションからドキュメントをサンプリングし、それらのドキュメントから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
を実行します。
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 は、常に同じデータ型を含むフィールドをリレーショナルモデルにマッピングします。 スキーマ生成は、次のケースを特別に処理します。
Numeric | BI Connector は、サンプリングされたドキュメントに一致する最も正確な数値型を使用します。 コレクション内のフィールドのデータ型が常に同じデータ型の場合、BI Connector はその型を使用します。 コレクション内のフィールドに浮動小数点値または整数のいずれかを含めることができる場合、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") }
このドキュメントを含むコレクションでmongodrdl
を実行すると、生成されたスキーマに次のフィールドが表示されます。
_id | numeric |
familyName | varchar |
hometown | varchar |
address.street | varchar |
address.city | varchar |
address.state | varchar |
address.zip | varchar |
members_since | timestamp |
配列
BI Connectorは、配列がないコレクションと、配列要素ごとに 1 つのドキュメントを持つコレクションの 2 つのコレクションを使用して、 business intelligenceツールに配列を公開します。
例
次のドキュメントを含む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" } ] }] }
その結果、次の 3 つの表が作成されます。
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
にmongodrdl
オプションを指定すると、BI Connector は含むドキュメントのフィールドを各配列要素のドキュメントに追加し、テーブルに「事前結合」します。
前の例では、テーブルには次の追加の列が含まれています。
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 つのコンポーネントを含むポイントのクラウドを記述する次のスキーマがあるとします。
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では、互換性のないデータをフィルタリングするために使用できる読み取り専用ビューが導入されています。
たとえば、 test
データベースに、 grades
コレクションのgrade
フィールドに数値を含むドキュメントのみを含むビューを作成できます。
db.runCommand( { create: "numericGrades", viewOn: "grades", pipeline: [ { "$match": { "grade": { "$type": "number" } } } ] } )
次に、 mongodrdl
を使用して、コレクションと同様にこのビューからスキーマを生成できます。
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 はインデックス フィールドを数値経度緯度座標の配列にマッピングします。
例
次の コレクションがあるとします。
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 は、ビューから読み取るときに地理空間フィールドを認識しません。