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.pngの説明が続きます
図mongodb.pngの説明

次の点を考慮する必要があります。
  • データベースの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 スタート・ガイド

次のステップを実行して、MongoDBのためのOracle Database APIの使用を開始します。
  1. ORDSをインストールおよび構成します:

    コマンド・プロンプトから、次のコマンドを使用してORDSをインストールおよび構成します。

    ノート:

    Autonomous Databaseに対してORDSをインストールする場合は、コマンドORDS install adbを使用します。
    ords install
    ords config set mongo.enabled true
    ords serve
    MongoDBのためのOracle APIが有効になっていることを示すログ:
    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
    
  2. 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;
  3. 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
        }
  4. 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
データベース・ツール(mongoimportmongorestore) 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を有効にするには、値をtrueに設定します。

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で設定します。