NoSQL データソースへの標準ベースのアクセス
MongoDB のような NoSQL データソースは、大容量でスケーラブル、かつアジャイルなデータ管理ソリューションを提供します。そのため、これらのデータソースを既存のインフラストラクチャや使い慣れたツールと統合したいというニーズが高まっています。 標準ベースのデータアクセスを活用すれば、ODBC、JDBC、ADO.NET といった標準規格の既存スキルを活かしながら、MongoDB の導入を進めることができます。 標準ベースのドライバーは、BI(ビジネスインテリジェンス)、アナリティクス、ETL との最大限の相互運用性も実現します。
MongoDB などの NoSQL データソースをリレーショナルデータベースとして接続できることは、BI、アナリティクス、ETL との統合において重要な要素です。Crystal Reports、Tableau、QlikView、TIBCO Spotfire といった主要な BI ツールは、標準ベースのドライバーが提供する SQL インターフェースを活用しています。
CData ドライバーを使用すると、標準 SQL で MongoDB データへの双方向アクセスが可能になります。CData ドライバーは MongoDB オブジェクトを正規化されたリレーショナルテーブルとしてモデル化します。この記事では、CData ドライバーを使用して NoSQL データソース内のオブジェクトにアクセスする方法を紹介します。具体的には、MongoDB 用 ODBC ドライバーを使用して、人気の BI ツールである Crystal Reports でレポートを作成する方法を解説します。
BI、アナリティクス、ETL から MongoDB に接続
CData ドライバーを使用すると、お使いのアプリケーションから NoSQL データソースへそのまま接続できます。ドライバーはスキーマ(テーブル定義)を自動生成するため、接続後すぐに SQL で MongoDB オブジェクトをクエリできるようになります。 DetectDataTypes プロパティに、カラムのデータ型を推測するためにスキャンする行数を設定するだけで準備完了です。
ドライバーはすべてのトップレベルのネイティブプロパティを適切な型のカラムとしてモデル化します。以下の JSON オブジェクトから推測されるデータ型を示します:
{
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 | Integer | 12 |
| name | String | Lohia Manufacturers Inc. |
| address | String | {street: "Main Street", city: "Chapel Hill", state: "NC"} |
| offices | String | ["Chapel Hill", "London", "New York"] |
| annual_revenue | double | 35,600,000 |
SQL からネストされたデータにアクセス
CData ドライバーは、XPath 標準を使用してネストされたデータに簡単にアクセスできます。JSON_EXTRACT SQL 関数を呼び出すことで、SQL からネストされたプロパティまで掘り下げることができます。第2引数に XPath を指定して、JSON 階層を目的のレベルまでフラット化します。SQL エイリアスを使用して、データセットのカラム名を定義します。
以下の例では、ネストされたオブジェクト配列の生の JSON を使用します:
offices: ["Headquarters", {street: "600 Main Street", city: "Chapel Hill", state: "NC"}]
offices オブジェクトのフィールドをフラット化するには、次の SQL を使用します:
SELECT JSON_EXTRACT(offices,'[1]') AS Headquarters, JSON_EXTRACT(offices,'[2].street') AS Street, JSON_EXTRACT(offices,'[3].city') AS City, JSON_EXTRACT(offices,'[4].state') AS State FROM Customers
上記のクエリから返されるデータセットには、以下のカラムが含まれます:
| カラム名 | データ型 | 値の例 |
|---|---|---|
| Headquarters | String | Headquarters |
| Street | String | 600 Main Street |
| City | String | Chapel Hill |
| State | String | NC |
カスタムテーブルからネストされたデータにアクセス
CData ドライバーでは、MongoDB から取得したいフィールドを正確に指定し、それをテーブルとしてクエリする方法を2つ提供しています:
- JSON_EXTRACT 式を使用して、クエリ内で XPath を指定する。
- 静的スキーマを作成して、JSON レスポンス内のネストされたオブジェクトや配列にカラムをマッピングする。
スキーマ(テーブル定義)は、シンプルな XML ベースのファイルで定義できます。スキーマファイルは、すべての CData ドライバー製品で使用できます。
この例のスキーマでは、以下のオブジェクト配列のフィールドにカラムをマッピングします:
offices: ["Headquarters", {street: "600 Main Street", city: "Chapel Hill", state: "NC"}]
次の定義で、例のフィールドにカラムをマッピングします:
<attr name="Headquarters" xs:type="string" other:bsonpath="offices.0" /> <attr name="OfficeStreet" xs:type="string" other:bsonpath="offices.1.street" /> <attr name="OfficeCity" xs:type="string" other:bsonpath="offices.1.city" /> <attr name="OfficeState" xs:type="string" other:bsonpath="offices.1.state" />
rsb:info セクションで定義された各 attr は、データベースのカラムを定義します。カラムを定義するには、以下の情報を指定します:
- Name:name にカラム名を設定します。
- Data Type:xs:type でデータ型を定義します。xs:type 属性でサポートされているデータ型は、integer、double、datetime、string、long、boolean です。
- XPath:other:bsonpath に、取得したい JSON 要素への XPath を設定します。配列の要素は 0 から始まるインデックスで指定します。other:bsonpath 属性の各「.」は、現在の要素の子要素を示します。
スキーマは .rsd ファイルで定義し、ファイル名でテーブル名を指定します。スキーマは、カラム定義とドライバーに同梱されている CRUD(作成、読み取り、更新、削除)操作の呼び出しで構成されます。以下は完全なスキーマ Office.rsd の例です。変更が必要なのは rsb:info ブロックのみで、残りのスクリプトはそのままコピーしてください。
<rsb:script xmlns:rsb="https://www.cdata.com/ns/rsbscript/2">
<rsb:info title="Office" description="An example schema.">
<!-- カラム定義 -->
< attr name="OfficeName" xs:type="string" other:bsonpath="offices.0" />
< attr name="OfficeStreet" xs:type="string" other:bsonpath="offices.1.street" />
< attr name="OfficeCity" xs:type="string" other:bsonpath="offices.1.city" />
< attr name="OfficeState" xs:type="string" other:bsonpath="offices.1.state" />
</rsb:info>
<rsb:script method="GET">
<rsb:call op="mongodbadoExecuteSelect">
<rsb:push />
</rsb:call>
</rsb:script>
<rsb:script method="POST">
<rsb:call op="mongodbadoExecutePost">
<rsb:push />
</rsb:call>
</rsb:script>
<rsb:script method="MERGE">
<rsb:call op="mongodbadoExecuteMerge">
<rsb:push />
</rsb:call>
</rsb:script>
<rsb:script method="DELETE">
<rsb:call op="mongodbadoExecuteDelete">
<rsb:push />
</rsb:call>
</rsb:script>
</rsb:script>
CData ドライバーを使用すると、任意の MongoDB オブジェクトの生の JSON を取得できます:
- Logfile 接続プロパティに、ドライバーが書き込み権限を持つ場所を設定します(例:C:\MongoDBLog.txt)。
- Verbosity 接続プロパティを 3 に設定します。ドライバーは JSON を含む HTTP リクエストのボディをログに記録します。
- MongoDB データベースに接続します。ドライバーがデータベース内のオブジェクトを検出します。
- 取得したい MongoDB オブジェクトに対して SELECT * クエリを実行します。
- ログファイルにサーバーからの生の JSON レスポンスが含まれているはずです。
カスタムスキーマを使用するには、Location 接続プロパティにスキーマファイルを設定し、再接続します。
Crystal Reports から MongoDB に接続
ODBC ドライバーは、主要な BI ツール全般でほぼ普遍的にサポートされています。Windows ツールを使用して管理できます。以下の手順に従って、ODBC データソース アドミニストレーターを使用し、Crystal Reports で MongoDB を ODBC データソースとして接続してください:
- DSN(データソース名)で接続プロパティを指定します。Microsoft ODBC データソース アドミニストレーターを使用して、ODBC DSN を作成・構成できます。一般的な接続プロパティは以下のとおりです:
- Server:接続先の MongoDB サーバーの名前またはアドレスを入力します。
- Database:接続先のデータベース名を入力します。
- User:認可されたユーザーのユーザー名を入力します。
- Password:認可されたユーザーのパスワードを入力します。
- AuthDatabase:認証データベースとは異なるデータベースに接続する場合、認証データベースの名前を入力します。

Crystal Reports で、新しいレポートを開き、Create New Connection -> ODBC をクリックします。
- 表示されるウィザードで、Select Data Source をクリックし、Data Source Name メニューから DSN を選択します。
レポートの設計
MongoDB への ODBC 接続を追加したら、レポートウィザードを使用して MongoDB オブジェクトをレポートに追加できます。
レポートウィザードで、Create New Connection -> ODBC をクリックし、MongoDB DSN を選択します。レポートに必要なテーブルとフィールドを選択して、データソースを構成します。ここでは、米国運輸統計局の 2015 年国内便のデータセットを使用します。 その後、チャートやその他のレポートオブジェクトを作成できます。レポートオブジェクトでは、レポートフィールドの集計やソートが可能です。

サーバーサイド処理の活用
MongoDB のような高速なデータベースでは、大規模な結果セットをサーバー側で構築することで、顕著なパフォーマンス向上が期待できます。CData ドライバーを使用すると、MongoDB のアグリゲーションフレームワークを活用して、データの変更を反映したレスポンシブなレポートを作成できます。Crystal Reports でチャートやその他のレポートオブジェクトを構築すると、Crystal Reports がドライバーにクエリを作成します。ドライバーは対応するリクエストを MongoDB API に送信します。
ドライバーは MongoDB API の機能を標準 SQL として公開します。以下に、いくつかのレポートオブジェクトと対応する SQL クエリを示します。使用するデータセットは、米国運輸統計局の 2015 年国内便データセットです。
次のクエリは、遅延を避けるための最適な出発時刻を見つけます。このクエリは、各出発時刻ごとの平均到着遅延を取得します。到着時間は、予定到着時刻と実際の到着時刻の差(分単位)です。早着した場合は負の数値で表されます:
SELECT AVG(ARR_DELAY) AS AvgARR_DELAY, DEP_TIME FROM Airlines GROUP BY DEP_TIME

このチャートを作成するには、レポートで Insert -> Chart をクリックし、Chart Wizard で以下を入力します:
- On Change Of メニューで、DEP_TIME を選択します。
- Show Values ボックスで、ARR_DELAY を選択し、集計オプションを average に設定します。

MongoDB は他の ODBC データソースと同様に扱うことができます。MongoDB をビジネスインテリジェンスや ETL ソリューションと統合するためのその他のガイドについては、オンラインナレッジベースをご覧ください。