by Jerod Johnson、翻訳:兵藤 | March 31, 2016

MongoDB のための便利なデータドライバー

MongoDB はNoSQL・ビッグデータストレージの代表格です。MongoDB を使って、一つのソースとして、異なるドキュメントを保存することができ、開発者およびユーザーはデータモデルの変更や拡張を柔軟に行うことができます。 CData Drivers for MongoDB は、実際のデータの収集・格納・処理はMongoDB で行いつつ、他のアプリケーションやサードパティツール(Tableau やMS アクセスなど)からの利用を実現します。 CData ドライバではODBC、JDBC、ADO.NET などの標準データ接続テクノロジーを使って、あたかもRDB のようにMongoDB データに連携が可能です。

MongoDB ドキュメントはフレキシブルであり、データの中にJSON オブジェクト、配列、それらのコンビネーションが存在します。 MongoDB が構造化されていないデータを格納するには大変便利ですが、逆に非構造化データをBI ツール、帳票ツールやETL ツールから扱うことは大変難しくなってしまいます。 CData ドライバは、MongoDB に格納されているデータをテーブルとしてモデル化し、RDB を主要な対象とする上述のサードパーティツールからのデータ利用を可能にします。 CData ドライバでは、スタンダードなSELECT、INSERT、UPDATE、DELETE の処理に加えて、MongoDB ドキュメントのテーブルへの読み替えや、クライアントサイドでのSQL 機能を提供しています。

MongoDB データのモデル化方法は次のようです:

  • Free-Form クエリ: テーブルスキーマのあるなしに関わらず、直観的にデータベースに存在していると考えられる項目をクエリ
  • オブジェクト&配列のフラット化: MongoDB に保管されたドキュメントと内部オブジェクトの複雑さに関わらず、動的にMongoDB データを探索するための接続プロパティ設定
  • カスタムスキーマ定義: ユーザー自身でスキーマを定義し、BI、帳票、ETLツールに対して、指定された形でデータのやり取りを可能に
  • クライアントサイドJSON 関数: MongoDB クライアントサイドJSON 関数

Free-Form クエリ

MongoDB データへの一番シンプルなデータアクセス方法は、直観的にデータベースに存在していると理解される項目を取得するクエリを投げる方法です。 同一のテーブルスキーマが存在しているかに関わらず、指定した項目のデータを取得することができます。 以下のドキュメントを例にします:

{
  id: 12,
  name: "Lohia Manufacturers Inc.",
  address: {street: "Main Street", city: "Chapel Hill", state: "NC"},
  offices: ["Chapel Hill", "London", "New York"]
  annual_revenue: 35,600,000
}

ここで各ドキュメントから、 idaddress.street、およびoffices[0] フィールドを取得したい場合に、Free クエリを使います:

SELECT
  id,
  address.street,
  offices.0,
FROM Company;

指定されたフィールドにデータを有するドキュメントからは、その値が返されます。ドキュメント内に指定されたフィールドを有しない場合には、NULL が返されます。 この方法は、CData ドライバに渡されるSQL クエリを自由にコントロールできる場合には有効ですが、コントロールできない場合には使用することができません。 その場合には、ほかの方法が必要です。

オブジェクト&配列のフラット化

CData ドライバの Flatten Arrays および Flatten Objects 接続プロパティによって、MongoDB 内のオブジェクトおよび配列を動的にテーブルスキーマに読み替えて定義する方法を管理できます。

以下に例を示します:

{
  id: 12,
  name: "Lohia Manufacturers Inc.",
  address: {street: "Main Street", city: "Chapel Hill", state: "NC"},
  offices: ["Chapel Hill", "London", "New York"]
  annual_revenue: 35,600,000
}

次の例では、いろいろなパターンのFlatten Arrays および Flatten Objects プロパティの設定で、下のクエリの結果がどうなるかを見てみましょう:

SELECT *
FROM Company

FlattenArrays=0;FlattenObjects=False;

フラット化を行わない場合には、CData ドライバは、テーブル内に、id、name、address、offices、annual revenue の5つのカラムを発見します。ドキュメント内のオブジェクトや配列は一つにまとめられて表示されます。

結果

id name address offices annual_revenue
12 Lohia Manufacturers Inc. {street: "Main Street", city: "Chapel Hill", state: "NC"} ["Chapel Hill", "London", "New York"] 35,600,000

FlattenArrays=0;FlattenObjects=True;

Flatten Objects を"true" に設定した場合、"address" オブジェクト内のカラムがフラット化されます。

結果

id name address_street address_city address_state offices annual_revenue
12 Lohia Manufacturers Inc. Main Street Chapel Hill NC ["Chapel Hill", "London", "New York"] 35,600,000

FlattenArrays=2;FlattenObjects=False;

Flatten Arrays プロパティは、配列内のアイテムをいくつ独立したカラムとして扱うかを決定します。Flatten Arrays を"2" に設定し、Flatten Objects = "false" に設定すると、ドキュメントの配列内の頭から2津のアイテムを取得します。

結果

id name address offices_0 offices_1 annual_revenue
12 Lohia Manufacturers Inc. {street: "Main Street", city: "Chapel Hill", state: "NC"} Chapel Hill London 35,600,000

これらのカラムはINSER やUPDATE によって拡張可能で、オブジェクトや配列を含むドキュメントを追加したり、更新したりすることができます。

カスタムスキーマ定義

MongoDB データをRDB として扱うためには、テーブルスキーマを定義しなければなりません。テーブルスキーマは接続プロパティで動的に生成するように設定する、もしくはユーザー自身でスキーマを定義することができます。 次のようなドキュメントで考えてみましょう:

{
  id: 12,
  name: "Lohia Manufacturers Inc.",
  address: {street: "Main Street", city: "Chapel Hill", state: "NC"},
  offices: ["Chapel Hill", "London", "New York"]
  annual_revenue: 35,600,000
}

このドキュメントに対し、id (主キー)、nameaddress.stateoffices フィールドのはじめのエントリー、をテーブルにするために次のスキーマを作成します:

  

    
    
    <attr  name="id"           xs:type="int32" iskey="true" other:bsonpath="$.id" />
    <attr  name="name"         xs:type="string" other:bsonpath="$.id"             />
    <attr  name="state"        xs:type="string" other:bsonpath="$.address.state"  />
    <attr  name="main_office"  xs:type="string" other:bsonpath="$.offices.0"      />
    

  


このようにスキーマを定義することで、MongoDB データに対し、きめ細かなコントロールを行うことができ、データビジュアライゼーション、データ変換、他のツールの機能を発揮することが可能になります。このような機能は通常のBI、帳票、ETL ツールには含まれていません。

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

MongoDB データセットのドキュメントはJSON 構造です。CData ドライバは、標準SQL 関数を使って、JSON 構造に対して使用することをサポートします。 これらの関数では、MongoDB ドキュメントを取得し、クライアントで対応すうる形にパースされた値を集計します。 多くの関数がサポートされており、以下の配列を使って例を示します:

[
  { "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 オブジェクトから個別の値を取得します。次のクエリは、関数の二つ目のアーギュメントとして渡された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 配列の数値の和を返します。次のクエリは、関数の二つ目のアーギュメントとして渡されたJSON パスをベースに値を返します:

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

クエリは次のデータを返します:

TotalScore
463

DOCUMENT

DOCUMENT 関数は、ドキュメント全体をJSON 文字列として取得するために使われます。次のクエリ結果を例として見てみましょう:

SELECT 
  DOCUMENT(*) 
FROM Students;

このクエリは、テーブル内のそれぞれのドキュメントを文字列として返します。

これらのCData ドライバの機能により、NoSQL のフレキシビリティとRDB の機能を合わせて使うことができます。

製品情報と無償評価版

MongoDB 製品ページ で製品情報を参照できます。 是非、30日の無償評価版 をご利用ください。



 
 
ダウンロード