9 MongoDBのためのOracle APIのサポート
この項では、MongoDBのためのOracle Database APIのサポートについて説明します。
ORDSリリース22.3以降、Oracle REST Data Servicesでは、スタンドアロン・モードで実行する場合、MongoDBのためのOracle Database APIがサポートされています。これにより、MongoDBドライバ、フレームワークおよびツールを使用して、Oracle Databaseに対してJSONドキュメント・ストア・アプリケーションを開発できます。MongoDBのためのOracle Database APIは、MongoDBワイヤ・プロトコルを、ORDS接続プールを使用して実行されるSQL文に変換します。
図9-1 MongoDBのためのOracle Database APIのアーキテクチャ図
- データベースのMongoDBの概念は、Oracle Databaseのスキーマの概念にマップされています。具体的には、ORDS対応のスキーマです。たとえば、データベース
fooのコレクションにJSONドキュメントを挿入する場合、MongoDBのためのAPIは、ORDS対応スキーマfooのコレクションにドキュメントを挿入します。 - MongoDBのためのAPIを使用する場合の認証および認可は、MongoDBユーザーではなく、Oracle Databaseユーザーおよびアクセス制御に依存します。MongoDBクライアントを接続する場合、接続オプション
authMechanism=PLAINおよびauthSource=$externalを使用して、MongoDBのLDAP認証メカニズムを使用してOracle Database資格証明を指定する必要があります。プロトコルはユーザー名とパスワードをプレーン・テキストとして渡すため、接続オプションtls=trueを使用してTLS/SSLを有効にする必要があります。 - MongoDBのためのOracle APIは、MongoDBコマンドを、コレクションを支える表上の対応するSQL文にマップします。
たとえば、
emp.find({"name":"John"})などのMongoDBコマンドは、select data from emp e where e.data."name" = 'John'のようなSQL select文を使用してデータベースに対して実行されます。 - 必要に応じて、JSONコレクションでSQLを直接実行できます。このモデルを使用すると、NoSQLドキュメント・ストアの速度、柔軟性、使いやすさを把握でき、ネイティブに格納されているJSONデータに対して分析とレポートに直接SQLを使用できます。
9.1 スタート・ガイド
- ORDSをインストールおよび構成します:
コマンド・プロンプトから、次のコマンドを使用してORDSをインストールおよび構成します。
ノート:
Autonomous Databaseに対してORDSをインストールする場合は、コマンドORDS install adbを使用します。MongoDBのためのOracle APIが有効になっていることを示すログ:ords install ords config set mongo.enabled true ords serveORDS serveコマンドを使用してORDSを起動すると、ログに次のようなメッセージが表示され、MongoDBのためのOracle APIが有効かどうかが確認されます。Disabling document root because the specified folder does not exist: ./config/global/doc_root 2022-08-17T15:23:04.043Z INFO Oracle API for MongoDB listening on port: 27017 2022-08-17T15:23:04.050Z INFO The Oracle API for MongoDB connection string is: mongodb://[{user}:{password}@]localhost:27017/{user}?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true - ORDS対応ユーザーを作成します:
サーバーを実行したままにして、SQLclからORDS対応ユーザーを作成します。
create user foo identified by "MyPassword1!"; grant soda_app, create session, create table, create view, create sequence, createprocedure, create job, unlimited tablespace to foo; connect foo/MyPassword1! exec ords.enable_schema; - MongoDBシェルを使用してORDSに接続します:
ノート:
デフォルトでは、ORDSは自己署名証明書を使用するため、tlsAllowInvalidCertificatesが必要です。署名証明書は、プロパティstandalone.https.certおよびstandalone.https.cert.keyを設定することで構成できます。mongosh --tlsAllowInvalidCertificates 'mongodb://foo:MyPassword1!@localhost:27017/foo?authMechanism=PLAIN&authSource=$external&tls=true&retryWrites=false&loadBalanced=true' foo> db.createCollection('emp'); { ok: 1 } foo> db.emp.insertOne({"name":"Blake","job": "Intern","salary":30000}); ... foo> db.emp.insertOne({"name":"Smith","job": "Programmer","salary": 60000,"email" : "smith@oracle.com"}); ... foo> db.emp.insertOne({"name":"Miller","job": "Programmer","salary": 70000}); ... foo> db.emp.find({"name":"Miller"}); [ { _id: ObjectId("6320bfc40dd73b60ef5641b9"), name: 'Miller', job: 'Programmer', salary: 70000 } ] foo> db.emp.updateOne({"name":"Miller"}, {$set: {"email":"miller@oracle.com"}}) { acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 } - MongoDBクライアントから挿入されたデータには、SQLからアクセスできます。
SQL> select json_serialize(e.data) from emp e; JSON_SERIALIZE(E.DATA) -------------------------------------------------------------------------------- {"_id":"6320bfa30dd73b60ef5641b7","name":"Blake","job":"Intern","salary":30000} {"_id":"6320bfb30dd73b60ef5641b8","name":"Smith","job":"Programmer","salary":60000,"email":"smith@oracle.com"} {"_id":"6320bfc40dd73b60ef5641b9","name":"Miller","job":"Programmer","salary":70000,"email":"miller@oracle.com"} SQL> select e.data."name".string() n, e.data."job".string() j from emp e where e.data."email".string() = 'miller@oracle.com'; N J -------------------- ----------------------- Miller Programmer
9.2 要件
この項では、クライアントおよびデータベースの要件をリストします。
MongoDB APIは、Oracle Databaseバージョン21c以降およびAutonomous Oracle Database 19c以降(共有、専用およびクラウド@customer)をサポートしています。通常、MongoDBのためのOracle APIでは、loadBalanced接続オプションをサポートするMongoDBツールとドライバがサポートされています。MongoDBのためのOracle APIは、具体的に次の表に示すクライアント・バージョンをサポートします。
表9-1 要件
| クライアント | サポートされている最小バージョン |
|---|---|
mongosh |
0.15.6 |
Java |
4.3.0 |
Python |
3.12.0 |
Node.js |
4.1.0 |
C# |
2.13.0 |
Golang |
1.6.0 |
データベース・ツール(mongoimport、mongorestore)
|
100.5.2 |
9.3 MongoDBの構成可能な設定
この項では、global/settings.xmlにあるグローバル構成に格納されているMongoDB APIをサポートするための編集可能な構成設定を示します。
ノート:
Oracle REST Data Servicesコマンドライン・インタフェースを使用して構成ファイルを編集することをお薦めします。表9-2 Mongo APIをサポートするための構成設定
| キー | タイプ | 説明 |
|---|---|---|
mongo.enabled(必須プロパティ) |
ブール値 | MongoDBのためのAPIを有効にすることを指定します。デフォルト値はfalseです。
MongoDBのためのAPIを有効にするには、値を |
mongo.access.log |
パス | MongoDBアクセス・ログのAPIを格納するフォルダへのパスを指定します。パスが指定されていない場合、アクセスは生成されません。 |
mongo.host |
文字列 | リスニングを行う特定のネットワーク・インタフェースを識別するためのホスト名またはIPアドレスのカンマ区切りのリストを指定します。デフォルト値は0.0.0.0です。
|
mongo.port |
整数 | MongoDBのためのAPIリスニング・ポートを指定します。デフォルト値は27017です。
|
mongo.idle.timeout |
期間 | 接続の最大アイドル時間をミリ秒単位で指定します。デフォルト値は30mです |
mongo.op.timeout |
期間 | データベース操作の最大時間をミリ秒単位で指定します。デフォルト値は10mです。
|
9.4 例
この項では、ords config setコマンドを使用してMongoDB設定を現在の作業ディレクトリ(CWD) global/settings.xmlに格納する例をいくつか示します。また、global/settings.xmlファイルのMongoDBリスナー設定の例も示します。
ords config setコマンドの使用例
ords config set mongo.enabled trueords config set mongo.host example.comords config set mongo.port 27017ords config set mongo.idle.timeout 40mords config set mongo.op.timeout 15m
global/settings.xmlのMongoリスナー設定の例
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Saved on Wed Jun 15 01:33:58 UTC 2022</comment>
<entry key="debug.printDebugToScreen">true</entry>
. . .
<entry key="mongo.host">example.com</entry>
<entry key="mongo.idle.timeout">40m</entry>
<entry key="mongo.enabled">true</entry>
<entry key="mongo.op.timeout">15m</entry>
<entry key="mongo.port">27016</entry>
. . .
</properties>
ords config getコマンドの使用例
ords config get mongo.enabledtrueords config get mongo.port27016
ords serveコマンドの使用
ords serveコマンドを使用して、スタンドアロン・モードで実行します。
ノート:
MongoDBのためのOracle APIを有効にするには、serveコマンドを実行する前に、mongo.enabledプロパティをtrueに設定する必要があります
9.5 接続プールへのアクセス
Oracle REST Data Servicesでは、複数のデータベースに接続する機能がサポートされています。installコマンドを使用して、複数の名前付きプールを定義できます。プールを追加すると、ORDS構成ディレクトリ内の./databasesの下に、対応するディレクトリが作成されます。Oracle REST Data Servicesの初期インストールでは、通常、defaultという名前のデフォルトのデータベース接続プールが追加されます。
デフォルトでは、MongoDB APIに接続すると、すべてのデータベース・リクエストがデフォルトの接続プールに送信されます。オプションで、ホスト名ファイルを使用して、MongoDB APIリクエストを他の接続プールにルーティングできます。たとえば、mydb1という名前のデータベース・プールの構成ディレクトリがords_config/databases/mydb1にあるとします。次のように、2つのホスト名を含むホスト名ファイルords_config/databases/mydb1/hostnamesを作成する場合:
www.example.com
example.comdefault接続プールではなくmydb1接続プールにルーティングされます。"mongodb://www.example.com:27017/scott?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true"
"mongodb://example.com:27017/scott?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true"
関連項目:
9.6 MongoDB APIアクセスのロギング
この項では、MongoDB APIへのリクエストのロギングを有効にする方法について説明します。
デフォルトでは、MongoDB APIへのリクエストはログに記録されません。MongoDB APIへのロギング・アクセスを有効にするには、構成プロパティmongo.access.logをディレクトリ・パスに設定する必要があります。ディレクトリ・パスが絶対パスでない場合、ORDS構成ディレクトリ(<ords config>)に対して相対的に解決されます。ディレクトリが存在しない場合、ORDSは起動時にディレクトリを作成します。ORDSは、MongoDB APIにアクセスするたびに、このディレクトリ内にアクセス・ログ・ファイル・エントリを追加します。
例:
ords config set mongo.access.log mongologs
このコマンドは、<ords config>/mongologs/フォルダ下のアクセス・ログ・ファイルに書き込みます。
9.7 高パフォーマンスの実現
この項では、高パフォーマンスの実現に役立つ設定について説明します。
より高いパフォーマンスまたはスループットが必要な環境では、一部のORDS接続プール・パラメータを構成およびチューニングする必要があります。
スループットを向上させるには、次の設定と値が役立ちます。これらのパラメータの最適なチューニングは、アプリケーションの要件によって異なります。
ords config set jdbc.MaxConnectionReuseCount 5000
ords config set jdbc.MaxConnectionReuseTime 900
ords config set jdbc.SecondsToTrustIdleConnection 1
ords config set jdbc.InitialLimit 100
ords config set jdbc.MaxLimit 100
説明:
MaxConnectionReuseTime: 接続が特定の回数流用された後に、接続を適切に閉じて接続プールから削除できるようにします。SecondsToTrustIdleConnection: 最近使用したか、最近テストしたデータベース接続を信頼するための秒数を設定し、接続チェックアウト中の検証テストをスキップします。InitialLimitおよびMaxLimits: 指定した接続プールの接続プール・サイズをUCPで設定します。
