Oracle Autonomous Database on Dedicated Exadata InfrastructureでのMongoDB APIの使用

Oracle Database API for MongoDBは、MongoDBワイヤ・プロトコルは、Oracle Databaseによって実行されるSQL文に変換します。MongoDBスキル・セットを持つ開発者は、MongoDBプロトコルを理解するドライバおよびツールを使用するOracle Database用のJSONドキュメント・ストア・アプリケーションを記述できます。このAPIの詳細は、『Oracle Database API for MongoDB』MongoDBのためのOracle Database APIの概要を参照してください。

MongoDB APIの有効化

OCIコンソールから、またはOracle REST Data Services (ORDS)を使用して手動で、Autonomous DatabaseのMongoDB APIを有効にできます。

Autonomous DatabaseでMongoDB APIを使用するには、顧客管理Oracle REST Data Services (ORDS)を個別にインストールおよび構成する必要があり、ORDSのバージョンは22.3以上である必要があります。このAPIのアーキテクチャの概念の詳細は、『Oracle REST Data Servicesインストレーションおよび構成ガイド』Oracle API for MongoDBサポートを参照してください。

OCIコンソールからMongoDB APIを有効にするには:
  • Autonomous Database「詳細」ページで、「ツール構成」タブを選択します。
  • 「ツール構成の編集」をクリックします。
  • MongoDB API行で、「ツールの有効化」列を選択して「有効」を表示します。
  • 適用をクリックします。
MongoDBが有効になるまで、ライフサイクル状態は更新中に変わります。

「拡張オプションの表示」を選択し、「ツール」タブを選択して、インスタンスをプロビジョニングまたはクローニングするときにMongoDB APIを有効にすることもできます。

MongoDBを手動で有効にするには:
  • ords install adbコマンドを使用してORDSをインストールおよび構成します。

    詳細は、Oracle REST Data Servicesインストレーションおよび構成ガイドAutonomous Databaseでの顧客管理ORDSのインストールおよび構成を参照してください。

  • ORDS対応ユーザーを作成します。
  • MongoDBシェルを使用してORDSに接続します。

前述のステップのデモは、『Oracle REST Data Servicesインストレーションおよび構成ガイド』スタート・ガイドを参照してください。

MongoDBアプリケーションの接続

MongoDB APIを有効にした後、MongoDBユーザーを作成し、その接続文字列を使用してAutonomous Databaseに接続できます。

MongoDB API接続文字列を使用すると、MongoDBシェル(コマンドライン・ユーティリティ)を使用して、データを接続して問い合せることができます。

Oracle Cloud Infrastructure Consoleから接続文字列を取得できます。MongoDB API接続文字列を取得するには:
  1. Autonomous Database「詳細」ページで、「ツール構成」タブを選択します。
  2. MongoDB API行の「アクセスURL」で、「コピー」をクリックします。

Exadata Cloud@Customer上のAutonomous DatabaseでMongoDB APIを使用している場合、ネットワーク/DNSチームは、MongoDB接続文字列ホスト名がクラスタのSCANに解決されることを確認する必要があります。これがないと、MongoDBクライアントはデータベースに接続できなくなります。ワイルドカードDNSレコードを使用してクラスタ内のすべてのAutonomous Databaseへの接続を許可するか、特定のAutonomous Databaseを許可できます:

MongoDB接続のテスト

MongoDBのテストAutonomous Databaseユーザーの作成

テスト目的で、テスト・ユーザーまたは同様の認証ユーザーを作成できます。

  1. Autonomous DatabaseのOCIコンソールを開きます。
  2. 「データベース・アクション」をクリックします。
  3. データベース・アクションの起動パッドから、「管理」→「データベース・ユーザー」をクリックします。
  4. 「データベース・ユーザー」ページで「+ユーザーの作成」をクリックします。
  5. テスト・ユーザーの「ユーザー名」および「パスワード」を入力します。「Webアクセス」をクリックし、表領域DATAの割当て制限を設定します。
  6. 「付与されたロール」タブをクリックします。
  7. デフォルトのロールに加えて、ユーザーのSODA_APPロールを選択して追加します。
  8. 「ユーザーの作成」をクリックします。

コマンドラインを使用した接続のテスト

  1. テスト・ユーザーでログインします。手順については、前の例のステップに従ってください。
    $ mongosh --tls --tlsAllowInvalidCertificates 'mongodb://TESTUSER:<PASSWORD>@<database URL>.
    <OCI region>.oraclecloudapps.com:27017/admin?authMechanism=PLAIN&authSource=$external&ssl=true&loadBalanced=false'
    Current Mongosh Log ID: 614c9e2a01e3575c8c0b2ec7
    Connecting to:         mongodb://TESTUSER:<PASSWORD>@<database URL>.<OCIregion>.oraclecloudapps.com:27017/admin?
    authMechanism=PLAIN&authSource=$external&tls=true&loadBalanced=false
    Using MongoDB:                   3.6.2
    Using Mongosh:                   1.0.7
    For mongosh info see: https://docs.mongodb.com/mongodb-shell/admin
    > show dbs
    testuser    0 B
    > 

    ノート:

    URIパーセント・エンコーディングを使用して、接続文字列URIの任意の予約文字(特にユーザー名とパスワードの文字)を置換します。予約文字とそのパーセント・エンコーディングは次のとおりです。

    ! # $ % & ' ( ) * +
    %21 %23 %24 %25 %26 %27 %28 %29 %2A %2B
    , / : ; = ? @ [ ]
    %2C %2F %3A %3B %3D %3F %40 %5B %5D

    たとえば、ユーザー名がRUTHで、パスワードが@least1/2#?の場合、サーバー<server>へのMongoDB接続文字列は次のようになります。

    'mongodb://RUTH:%40least1%2F2%23%3F@<server>:27017/ruth/ ...'

    使用するツールまたはドライバによっては、URI接続文字列の一部としてではなく、別のパラメータとしてユーザー名とパスワードを指定できる場合があります。その場合、含まれている予約文字をエンコードする必要はありません。

    関連トピック

  2. コレクションを作成し、コレクションにドキュメントを挿入します。
    testuser> show collections
    
    testuser> db.createCollection( 'fruit' )
    { ok: 1 }
    testuser> show collections
    fruit
    testuser> db.fruit.insertOne( {name:"orange", count:42} )
    {
      acknowledged: true,
      insertedId: ObjectId("614ca31fdab254f63e4c6b47")
    }
    testuser> db.fruit.insertOne( {name:"apple", count:12, color: "red"} )
    {
      acknowledged: true,
      insertedId: ObjectId("614ca340dab254f63e4c6b48")
    }
    testuser> db.fruit.insertOne( {name:"pear", count:5} )
    {
      acknowledged: true,
      insertedId: ObjectId("614ca351dab254f63e4c6b49")
    }
    testuser>
  3. データベース・アクションなどのSQLクライアントを使用してコレクションを問い合せます。
    SELECT
         f.json_document.name, 
         f.json_document.count, 
         f.json_document.color
    FROM fruit f;

Node.jsアプリケーションを使用した接続のテスト

  1. Node.jsをダウンロードします。ご使用の環境にNode.jsをすでにダウンロードまたはインストールしている場合は、このステップをスキップできます。

    $ wget https://nodejs.org/dist/latest-v14.x/node-v14.17.5-linux-x64.tar.xz
  2. Node、jsアーカイブの内容を抽出します。ご使用の環境にNode.jsをすでにダウンロードまたはインストールしている場合は、このステップをスキップできます。

    $ tar -xf node-v14.17.5-linux-x64.tar.xz
  3. PATH環境変数を構成します。ご使用の環境にNode.jsをすでにダウンロードまたはインストールしている場合は、このステップをスキップできます。

    $ export PATH="`pwd`"/node-v14.17.5-linux-x64/bin:$PATH
  4. Javascriptの例を使用して接続をテストします。

    1. 新規ディレクトリを作成

      $ mkdir autonomous_mongodb
      $ cd autonomous_mongodb
      $ npm init –y
    2. mongodb依存関係をインストールします。

      $ npm install mongodb
    3. connect.jsという名前のJavaScriptアプリケーションを作成します。

      const { MongoClient } = require("mongodb");
      const uri =
         "mongodb://TESTUSER:<PASSWORD>@<Database URI>.<OCI region>.oraclecloudapps.com:27017/admin?authMechanism=PLAIN&authSource=$external&ssl=true&loadBalanced=false";
      
      const client = new MongoClient(uri);
      
      async function run() {
        try {
              await client.connect();
      
              const database = client.db('admin');
              const movies = database.collection('movies');
      
              // Insert a movie
              const doc = { title: 'Back to the Future', 
                            year: 1985, genres: ['Adventure', 'Comedy', 'Sci-Fi'] }
              const result = await movies.insertOne(doc);
      
              // Query for a movie that has the title 'Back to the Future' :)
              const query = { title: 'Back to the Future' };
              const movie = await movies.findOne(query);
      
              console.log(movie);
        } finally {
           // Ensures that the client will close when you finish/error
           await client.close();
        }
      }
      run().catch(console.dir);
      

      ノート:

      URIパーセント・エンコーディングを使用して、接続文字列URIの任意の予約文字(特にユーザー名とパスワードの文字)を置換します。予約文字とそのパーセント・エンコーディングは次のとおりです。

      ! # $ % & ' ( ) * +
      %21 %23 %24 %25 %26 %27 %28 %29 %2A %2B
      , / : ; = ? @ [ ]
      %2C %2F %3A %3B %3D %3F %40 %5B %5D

      たとえば、ユーザー名がRUTHで、パスワードが@least1/2#?の場合、サーバー<server>へのMongoDB接続文字列は次のようになります。

      'mongodb://RUTH:%40least1%2F2%23%3F@<server>:27017/ruth/ ...'

      使用するツールまたはドライバによっては、URI接続文字列の一部としてではなく、別のパラメータとしてユーザー名とパスワードを指定できる場合があります。その場合、含まれている予約文字をエンコードする必要はありません。

      関連トピック

    4. 例を実行します。出力は次のようになります。

      $ node connect
      {
        _id: new ObjectId("611e3266005202371acf27c1"),
        title: 'Back to the Future',
        year: 1985,
        genres: [ 'Adventure', 'Comedy', 'Sci-Fi' ]
      }