NoSQL 統合のための先進的ドライバー



CData ドライバーは、NoSQL データ統合において最も高速かつ柔軟なサポートを提供します。この記事では、すべての NoSQL ドライバーに共通する機能と特徴について、MongoDB ドライバーを例に説明します。CData ドライバーを使用すると、NoSQL データベースをリレーショナルデータベースのように操作でき、NoSQL のデータストレージの柔軟性と SQL-92 クエリの使い慣れた操作性を両立できます。

NoSQL の柔軟性により、データ構造が JSON オブジェクト、配列、またはその組み合わせとして返されることがよくあります。これは階層データの格納には便利ですが、一般的な BI、レポート、ETL ツールでの作業が難しくなることがあります。CData ドライバーには、標準的なツールとの統合を簡素化するために、これらのデータ構造をマッピングまたはフラット化する機能が複数用意されています。

主な機能



以下にこれらの機能の例を示します。参考として、これらの例は以下の MongoDB サンプルドキュメントに基づいています:

サンプルドキュメント



{
  "_id" : ObjectId("5780046cd5a397806c3dab38"),
  "address" : {
    "building" : "1007",
    "coord" : [-73.856077, 40.848447],
    "street" : "Morris Park Ave",
    "zipcode" : "10462"
  },
  "borough" : "Bronx",
  "cuisine" : "Bakery",
  "grades" : [{
      "date" : ISODate("2014-03-03T00:00:00Z"),
      "grade" : "A",
      "score" : 2
    }, {
      "date" : ISODate("2013-09-11T00:00:00Z"),
      "grade" : "A",
      "score" : 6
    }, {
      "date" : ISODate("2013-01-24T00:00:00Z"),
      "grade" : "A",
      "score" : 10
    }, {
      "date" : ISODate("2011-11-23T00:00:00Z"),
      "grade" : "A",
      "score" : 9
    }, {
      "date" : ISODate("2011-03-10T00:00:00Z"),
      "grade" : "B",
      "score" : 14
    }],
  "name" : "Morris Park Bake Shop",
  "restaurant_id" : "30075445"
}

自由形式クエリ



MongoDB データにアクセスする最もシンプルな方法は、データソースに含まれていると分かっている内容に基づいてクエリを発行することです。これにより、厳密なテーブルスキーマの有無にかかわらず、必要なデータを正確に選択できます。上記のサンプルドキュメントを見てみましょう。

各ドキュメントから _idaddress.streetgrades[0] フィールドが必要だと分かっている場合、データベースからそのデータを自由にクエリできます:

SELECT
  [_id],
  [address.street],
  [grades.0],
FROM restaurants;

ドライバーは、ドキュメントにデータが含まれている場合、それらのフィールドの値を返します。特定のドキュメントにフィールドが存在しない場合、ドライバーはそのフィールドに対して NULL を返します。この機能は、CData ドライバーに送信される SQL クエリを制御できる場合に便利ですが、制御できない場合には他のオプションを利用できます。

水平フラット化



CData ドライバーの Flatten Arrays および Flatten Objects 接続プロパティを使用すると、MongoDB データ内のオブジェクトと配列をどのように解析してテーブルスキーマを動的に定義するかを制御できます。これらのプロパティにより、特定のドキュメント内のデータを水平方向にフラット化し、テーブル内のすべてのドキュメント(埋め込みデータを含む)に対して単一のテーブルスキーマを作成できます。これは、送信される SQL クエリを細かく制御できない場合に特に便利です。

以下の例では、次のクエリに対する Flatten ArraysFlatten Objects の各値に基づいて、期待される結果を示します:

SELECT *
FROM restaurants

FlattenArrays=0;FlattenObjects=False;

水平フラット化を行わない場合、ドライバーはテーブルに対して7つのカラム(_id、address、borough、cuisine、grades、name、restaurant_id)を検出します。ドキュメント内の埋め込みデータは、生の集約形式で返されます。

結果

_id address borough cuisine grades name restaurant_id
5780046cd5a397806c3dab38 { "building" : "1007", "coord" : [-73.856077, 40.848447], "street" : "Morris Park Ave", "zipcode" : "10462" } Bronx Bakery [{"date" : ISODate("2014-03-03T00:00:00Z"), "grade" : "A", "score" : 2 }, { "date" : ISODate("2013-09-11T00:00:00Z"), "grade" : "A", "score" : 6 }, { "date" : ISODate("2013-01-24T00:00:00Z"), "grade" : "A", "score" : 10 }, { "date" : ISODate("2011-11-23T00:00:00Z"), "grade" : "A", "score" : 9 }, { "date" : ISODate("2011-03-10T00:00:00Z"), "grade" : "B", "score" : 14}] Morris Park Bake Shop 30075445

FlattenArrays=0;FlattenObjects=True;

Flatten Objects を「true」に設定すると、埋め込まれた「address」サブドキュメントがフラット化されてカラム数が増えます。Flatten Objects を「false」のままにしている場合、配列やドキュメントの配列は集約形式で返されます。

結果

_id address.building address.coord address.street address.zipcode borough cuisine grades name restaurant_id
5780046cd5a397806c3dab38 1007 [-73.856077, 40.848447] Morris Park Ave 10462 Bronx Bakery [{"date" : ISODate("2014-03-03T00:00:00Z"), "grade" : "A", "score" : 2 }, ... ] Morris Park Bake Shop 30075445

FlattenArrays=2;FlattenObjects=False;

Flatten Arrays プロパティは、サブドキュメントの埋め込み配列内の何個の項目を個別のカラムとして扱うかを決定します。Flatten Arrays を「2」に設定し(Flatten Objects は「false」のまま)、ドキュメント内の埋め込み配列の最初の2つの項目を抽出します。

結果

_id address borough cuisine grades.0 grades.1 name restaurant_id
5780046cd5a397806c3dab38 { "building" : "1007", "coord" : [-73.856077, 40.848447], "street" : "Morris Park Ave", "zipcode" : "10462" } Bronx Bakery { "date" : ISODate("2014-03-03T00:00:00Z"), "grade" : "A", "score" : 2 } { "date" : ISODate("2013-09-11T00:00:00Z"), "grade" : "A", "score" : 6 } Morris Park Bake Shop 30075445

FlattenArrays=1;FlattenObjects=True;

Flatten Arrays を「1」に、Flatten Objects を「true」に設定すると、ドキュメント内の埋め込み配列の最初の項目を抽出し、埋め込まれたサブドキュメントをすべてフラット化します。

結果

_id address.building address.coord.0 address.street address.zipcode borough cuisine grades.0.date grades.0.grade grades.0.score name restaurant_id
57800... 1007 -73.856077 Morris Park Ave 10462 Bronx Bakery 2014-03-03... A 2 Morris Park Bake Shop 30075445

これらのカラムは INSERT および UPDATE ステートメントでも使用でき、サブドキュメントや配列内の個々のフィールドを追加または更新できます。

垂直フラット化



MongoDB のドキュメントには、サブドキュメントの配列が含まれていることがよくあります。水平フラット化(上記のセクションを参照)を使用してこれらのサブドキュメントを展開することも可能ですが、NoSQL データベースでこのような配列を扱う一般的な方法は、それらを別のデータテーブルとして扱うことです。このプロセスは垂直フラット化と呼ばれ、MongoDB インスタンス内の異なる「タイプ」のドキュメント間にリレーショナルモデルを構築するのに役立ちます。

上記のサンプルドキュメントを考慮すると、grades 配列を別のテーブルとして取得できます:

SELECT
  *
FROM [restaurants.grades];

このクエリは以下のデータセットを返します:

date grade score
2014-03-03T00:00:00Z A 2
2013-09-11T00:00:00Z A 6
2013-01-24T00:00:00Z A 10
2011-11-23T00:00:00Z A 9
2011-03-10T00:00:00Z B 14

ベースの restaurants テーブルからの情報も含めたい場合があります。これは JOIN を使用して実現できます。フラット化された配列は、ルートドキュメントとのみ結合できます。ドライバーは、JOIN の左側が垂直方向にフラット化する配列ドキュメントであることを期待しています。ネストされた MongoDB ドキュメントを結合するには、SupportEnhancedSQL 接続プロパティを false に設定してください。

SELECT
  [restaurants].[_id], [restaurants.grades].*
FROM
  [restaurants.grades]
JOIN
  [restaurants]
WHERE
  [restaurants].name = 'Morris Park Bake Shop'

このクエリは以下のデータセットを返します:

_id date grade score
5780046cd5a397806c3dab38 2014-03-03T00:00:00Z A 2
5780046cd5a397806c3dab38 2013-09-11T00:00:00Z A 6
5780046cd5a397806c3dab38 2013-01-24T00:00:00Z A 10
5780046cd5a397806c3dab38 2011-11-23T00:00:00Z A 9
5780046cd5a397806c3dab38 2011-03-10T00:00:00Z B 14

カスタムスキーマ定義



MongoDB データをリレーショナルデータベースとして扱うには、テーブルスキーマが必要です。スキーマは、接続プロパティを使用して動的に作成するか、自分で定義できます。これは、構築される SQL クエリを完全に制御できない場合にデータを詳細に取得するためのもう一つのオプションです。

上記のドキュメントを考慮すると、_id(主キーとして)、nameaddress.zipcode、および grades の最初のエントリを、以下のスキーマを作成して公開できます:



  
    
    <attr  name="id"           xs:type="int32" iskey="true" other:bsonpath="$._id" />
    <attr  name="name"         xs:type="string" other:bsonpath="$.name"             />
    <attr  name="zipcode"        xs:type="string" other:bsonpath="$.address.state"  />
    <attr  name="latest_grade"  xs:type="string" other:bsonpath="$.offices.grade"      />
  

  <rsb:set attr="collection" value="companies"/>


カスタムスキーマファイルを作成したら、ファイル拡張子「.rsd」でディスクに保存し(通常はインストール場所の db フォルダー)、Location 接続プロパティを同じ場所に設定します。ドライバーは、rsb:infotitle 属性に基づいて、サードパーティのツールやアプリで定義されたテーブルを公開します。SQL クエリでテーブル名として title を使用して、データを明示的にクエリすることもできます:

SELECT
  id, latest_grade
FROM
  StaticRestaurants;

MongoDB データのスキーマを定義することで、BI、レポート、ETL ツールでは一般的にサポートされていない方法でデータを細かく制御でき、お気に入りのツールのデータ可視化、変換、抽出機能を活用して、望む方法でデータを操作できます。カスタムスキーマでは、単一の「テーブル」に格納されたデータの異なるビューを定義することもでき、type フィールドのようなもので関連するフィールドが区別されるドキュメントを含むことができる MongoDB データベースの NoSQL の特性を最大限に活用できます。

クライアントサイド JSON 関数



MongoDB データセット内のドキュメントは、本質的に JSON 構造です。CData ドライバーは、JSON 構造を操作するための標準 SQL 関数の使用をサポートしています。これらの関数は、MongoDB ドキュメントを取得し、クライアントで関連情報を解析することで動作します。サポートされている関数は多数ありますが、ここではいくつかのみを紹介します。以下の例では、'Students' テーブルに含まれるサンプルドキュメントを使用しています:

{
  id: 123456,
  ...,
  grades: [
            { "grade": "A", "score": 96 },
            { "grade": "A", "score": 94 },
            { "grade": "A", "score": 92 },
            { "grade": "A", "score": 97 },
            { "grade": "B", "score": 84 }
          ],
  ...
}

JSON_EXTRACT

JSON_EXTRACT 関数は、JSON オブジェクトから個々の値を抽出できます。次のクエリは、関数の第2引数として渡された JSON パスに基づいて、以下に示す値を返します:

SELECT
  JSON_EXTRACT(grades,'[0].grade') AS Grade,
  JSON_EXTRACT(grades,'[0].score') AS Score
FROM Students;

このクエリは以下のデータを返します:

GradeScore
A 96

JSON_SUM

JSON_SUM 関数は、JSON オブジェクト内の JSON 配列の数値の合計を返します。次のクエリは、関数の第2引数として渡された JSON パスで指定された値の合計を返します:

SELECT
  Name,
  JSON_SUM(score,'[x].score') AS TotalScore
FROM Students;

このクエリは以下のデータを返します:

TotalScore
463

DOCUMENT

DOCUMENT 関数は、ドキュメント全体を JSON 文字列として取得するために使用できます。以下のクエリとその結果を例として参照してください:

SELECT
  DOCUMENT(*)
FROM Students;

上記のクエリは、テーブル内の各ドキュメントを単一の文字列として返します。

DOCUMENT
{ "_id" : ObjectId("5780046cd5a397806c3dab38"), "address" : { "building" : "1007", "coord" : [-73.856077, 40.848447], "street" : "Morris Park Ave", "zipcode" : "10462" }, "borough" : "Bronx", "cuisine" : "Bakery", "grades" : [{ "date" : ISODate("2014-03-03T00:00:00Z"), "grade" : "A", "score" : 2 }, { "date" : ISODate("2013-09-11T00:00:00Z"), "grade" : "A", "score" : 6 }, { "date" : ISODate("2013-01-24T00:00:00Z"), "grade" : "A", "score" : 10 }, { "date" : ISODate("2011-11-23T00:00:00Z"), "grade" : "A", "score" : 9 }, { "date" : ISODate("2011-03-10T00:00:00Z"), "grade" : "B", "score" : 14 }], "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" }

今すぐ始める



NoSQL ドライバーは、NoSQL データベースを操作する上で非常に高い柔軟性を提供します。詳細情報や30日間の無料トライアルのダウンロードについては、最新の NoSQL ドライバーをご覧ください。

関連記事



始める準備はできましたか?

MongoDB 用ドライバーの詳細、または無料トライアルをダウンロード:

今すぐダウンロード