このブログは「Oracle Database API for MongoDB」の翻訳です。
以下のQiita記事も参考にしていただければと思います。
- [OCI]MongoDBクライアントからAutonomous JSON Databaseに接続してみた(MongoDB Shell編)
- [OCI]MongoDBクライアントからAutonomous JSON Databaseに接続してみた(mongoexport/mongoimport編)
- [OCI]MongoDBクライアントからAutonomous JSON Databaseに接続してみた(Node.jsアプリケーション編)
- [OCI]Autonomous Databaseのサンプルデータセットから1000万件のJSONドキュメントを生成してmongoimportでAutonomous Databaseにインポートしてみた
Autonomous JSON Database向けの新しいAPIであるOracle Database API for MongoDBが利用開始となったことを発表します。
MongoDBアプリケーションのシームレスな開発と移行
新しいAPIにより、開発者はMongoDBのオープン・ソースのツールやドライバーをそのまま使用しながら、「Oracle Autonomous JSON Database」に接続し、オラクルのマルチモデル機能や自律型データベースのメリットも得ることができます。お客様はOracle Cloud Infrastructure(OCI)上でMongoDBのワークロード実行が可能になりました。
多くの場合、接続文字列を変更するだけで、既存のアプリケーションにほとんど(あるいは全く)変更を加える必要はありません。
「Oracle Autonomous JSON Database」で利用可能に
「Oracle Autonomous JSON Database」は、JSONを中心とした開発を低コストで行えるように設計されています。開発者は、API for MongoDBとOracle SQLの両方を使用して同じドキュメントデータにアクセスできるため、分析、機械学習、空間分析などのために、わざわざデータを別のデータベースに移す必要がありません。これにより、MongoDB Atlasに代替する選択肢となり、以下のような高度な機能を提供します。
- スケーラブルなSQLを使用した完全な分析クエリおよびレポート
- 異なるJSONドキュメント・コレクション間、またはJSONドキュメントと他のリレーショナル・データ間の結合
- リレーショナル・データと分析クエリの結果をMongoDBのコレクションとして公開
- 機械学習アルゴリズムや空間分析をJSONドキュメント・データ上で実行
- Oracle APEXを活用したローコード・アプリケーションの開発
- 期間・データサイズ制限なしのACID トランザクション
- 管理者によるユーザー・データへのアクセスを不可にする、Database Vaultなどのエンタープライズ・セキュリティ機能
また、API for MongoDBは、オラクルの主力クラウド・データベース・サービス「Autonomous Database」でも利用可能です。
Autonomous JSON DatabaseとAPI for MongoDBを使ってみる
Oracle Autonomous JSON Databaseでは、MongoDBデータベースに接続しているかのように、JSONドキュメント・コレクションを操作できます。
このクイック・スタート・ガイドでは、Oracle Database API for MongoDBを使い始めるのに必要なステップを説明しています。ドキュメントの全文は、以下よりご覧いただけます。
Database API for MongoDBの設定に関するAutonomous Databaseの章 (英語)
Oracle Database API for MongoDB向けドキュメント (英語)
まだOracle Cloudのアカウントをお持ちでない方は、まず登録していただく必要があります。Always-Freeのアカウントを使用できるので、お客様がご自分で有料アカウントにアップグレードしない限り、クレジットカードに請求されることはありません。Oracle Cloudアカウントへのご登録と、Autonomous JSON Databaseの無償利用に関する詳細は、こちらをご覧ください。
登録が完了したら、AJD(Autonomous JSON Database)を作成する必要があります(Database API for MongoDBを他のAutonomous Databaseワークロードで使用することもできますが、ここではAJDについてお話します)。
Oracle Cloudにサインインしたら、左上のメニューアイコンをクリックし、表示されるメニューから、「Oracle Database」、「Autonomous JSON Database」の順に選択します。

次に「Create Autonomous Database」をクリックします。

表示名とデータベース名を入力します(生成されたデフォルトのままでもOK)。ワークロード・タイプを「JSON」、デプロイメントタイプを「Shared Infrastructure」に設定します。

スクロールダウンして「Create administrator credentials(管理者資格証明の作成)」を選択し、ADMINユーザーのパスワードを「Password」、「Confirm password」欄に入力します。このパスワードを忘れないように気をつけましょう。

次のステップは重要です。Database API for MongoDBは、「Secure access from allowed IPs and VCNs only(許可されたIPおよびVCN限定のセキュア・アクセス)」を選択した場合にのみ利用可能になります。このオプションをクリックします(デフォルトではありません)。

現在お使いのマシンから接続したい場合は、「Add My IP Address(自分のIPアドレスを追加)」ボタンをクリックしてください。他のマシン(Oracle Cloud VMなど)から接続したい場合は、それらのマシンのアドレスも入力できます。
ヒント: どのコンピュート・インスタンスから接続するかわからない場合は、「IP notation type(IP表記法タイプ)」フィールドを「CIDR block」に変更し、0.0.0.0/0の値を入力してください。こうすることで、どこからでも接続できるようになりますが、当然ながらテスト時に限定した使用をお勧めします。
完了したら、画面下部の「Create Autonomous Database」をクリックします。オレンジ色のAJDロゴと、その下に「PROVISIONING」と表示されます。

完了すると(通常は1分程度かかります)、ロゴが緑色になり、その下に「AVAILABLE」と表示されます。
これでサービス・コンソールにアクセス可能となりました。

サービス・コンソールが新しいタブで開き、「Development」が選択できます。

「Development」ページで少し下にスクロールすると、「Oracle Database API for MongoDB」と表示され、2つのURLが記載されているはずです。

確認できませんか?ほとんどの場合は、データベースに「Secure Access from allowed IPs (許可されたIPからセキュアにアクセス)」を選択しなかったことが原因です。データベースが「Secure Access from anywhere(どこからでもセキュアにアクセス)」に設定されている場合、このカードは表示されません(一定のバージョン以降では表示されますが、グレーアウトされます)。
ポート27017は、ほとんどの新しいクライアントやツールで動作可能ですが、問題が発生した場合は、代わりにポート27016のURLを試してみてください。
最初のURLを「Copy」ボタンでコピーし、好きな場所に保存しておきます。
URLのフォーマットは以下になります。
mongodb://[user:password@]autonomousDatabaseAddress:27017/[user]?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true
最初の[user:password@]を削除し(別途認証情報を渡します)、URL後半部分の[user]をデータベースのユーザー名(現在は 「admin」)に変更します。変更後のURLは以下のようになります。
mongodb://autonomousDatabaseAddress:27017/admin?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true
ここで、MongoDBツールの 「mongosh」を使って、ローカル・マシンから接続する必要があります。インストールはMongoDBのページから可能です。https://www.mongodb.com/try/download/shell
まず、VPNやプロキシ・サーバーを経由して接続していないことを確認してください(IPアドレスが変更され、接続できなくなります)。そして、「-user admin」と、上記で変更したURLを一重引用符(Linux/Mac)または二重引用符(Windows)で囲んだものをコマンド・プロンプトとし「mongosh」を実行します。コマンドは以下のようになります。
mongosh -u admin -p MyPassword123 'mongodb://autonomousDatabaseAddress:27017/admin?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true'

接続できませんか?URLが正しく引用符で囲まれているか、または、データベースに登録されているクライアント・システムのIPアドレスが正しいか(VPN経由で接続されていないか等)を確認してください。また、mongoshコマンドが1行になっているか、知らないうちに余分な改行文字が入っていないかどうかも確認してください。
接続できたら、Mongo Shellを使ってコレクションを作成し、ドキュメントを追加します。例えば、「emp」というコレクションを作成し、JSON形式の従業員ドキュメントを追加できます。
db.createCollection('emp')
db.emp.insertOne(
{ "name":"Blake", "job": "Intern", "salary":30000 }
)
db.emp.insertOne(
{ "name":"Smith", "job": "Programmer", "salary": 60000, "email" : "smith@example.com" }
)
db.emp.insertOne(
{ "name":"Miller", "job": "Programmer", "salary": 70000 }
)
AJDに接続すれば、ほとんどのMongo操作を実行できます。ただし、ユーザー管理コマンド、インデックス操作、集計パイプライン操作は、SQLで行いましょう。
他のMongoDBツールやMongoDBドライバを使うプログラムも、上記のようにURLを提供し、必要に応じて認証情報を提供することで、同様に動作します。
次に、データベースツールを使ってコレクションの取り扱い方法を見てみましょう。Oracle Cloudに戻り、「Overview」→「Autonomous Database」→「Autonomous Databases」でデータベースを探します。データベースの名前をクリックします。

そして、「Database Actions」ボタンをクリックします。

そうすると、「Database Actions」のページが新しいブラウザ・タブで開きます。開かなかったでしょうか?おそらくネットワーク接続の問題でしょう。ブラウザが動作しているIPアドレスに対して、ACLが有効であることを確認してください。接続できたら、ユーザー名「ADMIN」と、先ほどデータベース管理者用に設定したパスワードを入力する必要があるかもしれません(コンソールのバージョンによっては、ADMINとして自動的にログインできる場合もあります)。
「Database Actions」では、いくつかのオプションが用意されています。今回はJSONやSQLを見てみましょう。まず、JSONを起動します。

そうすると、「JSON Workshop 」に移動します。初回は、短いチュートリアルが表示されます。まず参照いただくことをお勧めしますが、画面右上のボタンから、後から参照することもできます。
「JSON Workshop」では、左にコレクション、右にドキュメントが表示されます。Workshopの中でコレクションやドキュメントの作成、編集、削除ができます。ドキュメントの上にあるボックスは、クエリを入力するための検索ボックスです。これは「Queries by Example(例による問い合せ)」または「QBE」と呼ばれるものです。簡単な検索を入力してみましょう: { “job”:”Programmer” }、そして「Run」をクリックします。

また、ここからJSONコンテンツに対してのインデックス作成もできます。もちろん、3つのドキュメント・コレクションに対する検索を高速化するために、索引を使用することはないでしょうが、今回は索引を作る方法を見ていきます。
画面左にあるコレクション「emp」を右クリックします。

「Indexes」をクリックすると、「Indexes」ダイアログが表示されます。新しいJSONインデックスを追加するには、「+」サインをクリックしてください。

ここにはいくつかのオプションがあります。「Advanced」を選択するとさらに多くのオプションがあります。このブログでは、すべてのオプションについては説明しませんが、給与に関する実用的な(通常の)索引を作成してみましょう。これに「salary_idx」などの名前を付け、「Properties」ボックスに「*」と入力します。「salary」の横のボックスにチェックを入れて、一番下の「Create」をクリックします。

JSON Workshopをさらに試していただいてもよいですが、ここではSQLに進めます。
ヘッダーの「Database Actions」をクリックします。

次に「SQL」を選択します。

これで「SQL Developer Web」が表示されました。デスクトップのSQL Developerツールを使い慣れている人には馴染みのある内容でしょう。ここでも初回エントリ時にチュートリアルが実行されます。
左側には「Tables」の表示があり、「EMP」というテーブルがあります。これは、「emp」コレクションを格納するために自動的に作成されたテーブルです。開いてみると、いくつかの列があり、そのうちの一つが「DATA」と呼ばれています。JSONドキュメントがそのまま入っていると予想されたでしょうが、実際には見てわかる形ではなくバイナリ表現であり、単に「select * from emp」のようにしても見られません。その代わりに、JSON_SERIALIZEを使ってコンテンツを調べることができます。さっそく試してみましょう。
select json_serialize(data) from emp;
こちらを入力し、「Run Statement」ボタンをクリックします。

3つのJSONドキュメントが、それぞれEMPテーブルの別の行に格納されていることがわかります。
嬉しいことに、mongoshやJSON Workshopだけでなく、SQLを使ってテーブルからJSONを取り出すこともできます。では、JSON内のフィールドに対してSQLを実行したい場合はどうでしょうか?こちらも「単純なドット表記法」を使って簡単にJSONから値を取り出すことができます。なお、ドット表記法を使用するには、表別名(次の例では「e」)の使用が必須です。
select e.data.name, e.data.salary from emp e;
これを見ると、まるでリレーショナル・データの表と列のように、データが戻されていることがわかります。このデータを使えば、通常の列でできることは何でもできます。シンプルなコレクションに対し、仕事別の平均給与を求めてみましょう。
select avg(e.data.salary), e.data.job from emp e group by e.data.job

ここでは、SQL/JSONの機能をほんの少しだけ紹介しましたが、その意図は、MongoDBツール、Oracle JSONツール、SQL/JSONを同じデータに対してシームレスに使用できることをご紹介したかったからです。OracleのJSON機能の詳細については、以下のリンクからご覧ください。
- ドキュメント: Oracle JSON Developers Guide (日本語)
- ウェブページ: Oracle JSON
- ウェブページ: Autonomous JSON Database
- LiveLab: Developing with JSON and SODA in Oracle Database (英語)
- その他のブログ: Database InsiderのJSONカテゴリ (英語)
- GitHub: Oracle JSON
- Web Page: Autonomous JSON Databaseを無料で入手
Database API for MongoDBの完全なドキュメントはこちらからご覧ください。