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
を使用します。ords install ords config set mongo.enabled true ords serve
ORDS 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以降(Serverless、DedicatedおよびCloud@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 true
ords config set mongo.host example.com
ords config set mongo.port 27017
ords config set mongo.idle.timeout 40m
ords 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.enabled
true
ords config get mongo.port
27016
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.com
default
接続プールではなく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で設定します。