はじめに
Oracle Database API for MongoDBを利用することにより、MongoDBクライアント、ドライバーからAutonomous JSON Databaseにアクセスして、Autonomous JSON DatabaseをMongoDBと同じように扱うことができるようになりました。
ということで、MongoDBのクライアントであるMongoDB ShellからAutonomous JSON Databaseに接続してみました。
1.Computeインスタンスの作成
今回はOSとしてOracle Linux7.9を選択して、Computeインスタンスを作成しました。
2.MongoDBのインストールと準備
MongoDBとAutonomous JSON Databaseの比較のため、作成したComputeインスタンスにMongoDBをインストールします。
MongoDB 5.0のyumリポジトリを追加します。
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
yum installでMongoDBをインストールします。
[opc@work ~]$ sudo yum install mongodb-org-5.0.5 mongodb-org-server-5.0.5 mongodb-org-shell-5.0.5 mongodb-org-mongos-5.0.5 mongodb-org-tools-5.0.5
Loaded plugins: langpacks, osmsplugin, ulninfo
This system is receiving updates from OSMS.
mongodb-org-5.0 | 2.5 kB 00:00
Resolving Dependencies
--> Running transaction check
---> Package mongodb-org.x86_64 0:5.0.5-1.el7 will be installed
--> Processing Dependency: mongodb-org-database for package: mongodb-org-5.0.5-1.el7.x86_64
---> Package mongodb-org-mongos.x86_64 0:5.0.5-1.el7 will be installed
---> Package mongodb-org-server.x86_64 0:5.0.5-1.el7 will be installed
---> Package mongodb-org-shell.x86_64 0:5.0.5-1.el7 will be installed
---> Package mongodb-org-tools.x86_64 0:5.0.5-1.el7 will be installed
--> Running transaction check
---> Package mongodb-org-database.x86_64 0:5.0.5-1.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==============================================================================
Package Arch Version Repository Size
==============================================================================
Installing:
mongodb-org x86_64 5.0.5-1.el7 mongodb-org-5.0 6.1 k
mongodb-org-mongos x86_64 5.0.5-1.el7 mongodb-org-5.0 19 M
mongodb-org-server x86_64 5.0.5-1.el7 mongodb-org-5.0 28 M
mongodb-org-shell x86_64 5.0.5-1.el7 mongodb-org-5.0 15 M
mongodb-org-tools x86_64 5.0.5-1.el7 mongodb-org-5.0 6.1 k
Installing for dependencies:
mongodb-org-database x86_64 5.0.5-1.el7 mongodb-org-5.0 6.2 k
Transaction Summary
==============================================================================
Install 5 Packages (+1 Dependent package)
Total download size: 62 M
Installed size: 231 M
Is this ok [y/d/N]: y
Downloading packages:
(1/6): mongodb-org-database-5.0.5-1.el7.x86_64.rpm | 6.2 kB 00:00
(2/6): mongodb-org-5.0.5-1.el7.x86_64.rpm | 6.1 kB 00:00
(3/6): mongodb-org-mongos-5.0.5-1.el7.x86_64.rpm | 19 MB 00:00
(4/6): mongodb-org-server-5.0.5-1.el7.x86_64.rpm | 28 MB 00:00
(5/6): mongodb-org-shell-5.0.5-1.el7.x86_64.rpm | 15 MB 00:00
(6/6): mongodb-org-tools-5.0.5-1.el7.x86_64.rpm | 6.1 kB 00:00
------------------------------------------------------------------------------
Total 39 MB/s | 62 MB 00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : mongodb-org-mongos-5.0.5-1.el7.x86_64 1/6
Installing : mongodb-org-tools-5.0.5-1.el7.x86_64 2/6
Installing : mongodb-org-server-5.0.5-1.el7.x86_64 3/6
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service to /usr/lib/systemd/system/mongod.service.
Installing : mongodb-org-shell-5.0.5-1.el7.x86_64 4/6
Installing : mongodb-org-database-5.0.5-1.el7.x86_64 5/6
Installing : mongodb-org-5.0.5-1.el7.x86_64 6/6
Verifying : mongodb-org-shell-5.0.5-1.el7.x86_64 1/6
Verifying : mongodb-org-server-5.0.5-1.el7.x86_64 2/6
Verifying : mongodb-org-tools-5.0.5-1.el7.x86_64 3/6
Verifying : mongodb-org-mongos-5.0.5-1.el7.x86_64 4/6
Verifying : mongodb-org-database-5.0.5-1.el7.x86_64 5/6
Verifying : mongodb-org-5.0.5-1.el7.x86_64 6/6
Installed:
mongodb-org.x86_64 0:5.0.5-1.el7
mongodb-org-mongos.x86_64 0:5.0.5-1.el7
mongodb-org-server.x86_64 0:5.0.5-1.el7
mongodb-org-shell.x86_64 0:5.0.5-1.el7
mongodb-org-tools.x86_64 0:5.0.5-1.el7
Dependency Installed:
mongodb-org-database.x86_64 0:5.0.5-1.el7
Complete!
[opc@work ~]$
MongoDBを起動します。
[opc@work ~]$ sudo systemctl start mongod
MongoDBの状態を確認します。
[opc@work ~]$ sudo systemctl status mongod -l
● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-01-18 19:10:35 JST; 6min ago
Docs: https://docs.mongodb.org/manual
Main PID: 13505 (mongod)
CGroup: /system.slice/mongod.service
└─13505 /usr/bin/mongod -f /etc/mongod.conf
Jan 18 19:10:34 work systemd[1]: Starting MongoDB Database Server...
Jan 18 19:10:34 work mongod[13501]: about to fork child process, waiting until server is ready for connections.
Jan 18 19:10:34 work mongod[13501]: forked process: 13505
Jan 18 19:10:35 work systemd[1]: Started MongoDB Database Server.
[opc@work ~]$
MongoDBが自動起動するようにします。
[opc@work ~]$ sudo systemctl enable mongod
MongoDB Shell(mongosh)からローカルのMongoDBに接続します。
[opc@work ~]$ mongosh
Current Mongosh Log ID: 61ea4fa3e9f03bc6f1b4a89a
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.1.9
Using MongoDB: 5.0.5
Using Mongosh: 1.1.9
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.
------
The server generated these startup warnings when booting:
2022-01-21T06:15:38.931+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2022-01-21T06:15:38.931+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
------
test>
データベースadminに接続します。
test> use admin
switched to db admin
admin>
管理者ユーザadmin(パスワード:Demo#1Demo#1)を作成し、rootロールを付与します。
admin> db.createUser({user:"admin", pwd:"Demo#1Demo#1", roles:[{role:"root", db:"admin"}]})
{ ok: 1 }
admin>
作成したユーザを確認します。
admin> db.getUsers()
{
users: [
{
_id: 'admin.admin',
userId: UUID("63aef149-23ed-4084-99b6-0ebe25572a3a"),
user: 'admin',
db: 'admin',
roles: [ { role: 'root', db: 'admin' } ],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
],
ok: 1
}
admin>
MongoDB Shellを終了します。
admin> exit
[opc@work ~]$
MongoDBを停止します。
[opc@work ~]$ sudo systemctl stop mongod
[opc@work ~]$
MongoDBはデフォルトではユーザ認証が無効になっているので、ユーザ認証を有効にします。
MongoDBの設定ファイル/etc/mongod.confを開きます。
[opc@work ~]$ sudo vi /etc/mongod.conf
ファイルの末尾に以下の内容を追加します。
security:
authorization: enabled
MongoDBを起動します。
[opc@work ~]$ sudo systemctl start mongod
[opc@work ~]$
3.MongoDBの操作
MongoDB ShellからローカルのMongoDBにadminユーザで接続します。
[opc@work ~]$ mongosh -u admin -p Demo#1Demo#1
Current Mongosh Log ID: 61e7c76c26caf16738d30340
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000
Using MongoDB: 5.0.5
Using Mongosh: 1.1.8
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
------
The server generated these startup warnings when booting:
2022-01-19T00:31:08.448+09:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
------
test>
データベースの一覧を確認します。
test> show dbs
admin 209 kB
config 61.4 kB
local 73.7 kB
test>
useコマンドでデータベースを作成し、データベースmongoに接続します。
test> use mongo
switched to db mongo
mongo>
コレクションdeptを作成します。
mongo> db.createCollection('dept')
{ ok: 1 }
mongo>
insertOne()メソッドでdeptコレクションを作成し、JSONドキュメントを追加します。
mongo> db.dept.insertOne({"deptno":10,"deptname":"ACCOUNTING","location":"NEW YORK"})
{
acknowledged: true,
insertedId: ObjectId("61e7c80d8845e822d33dab38")
}
mongo> db.dept.insertOne({"deptno":20,"deptname":"RESEARCH","location":"DALLAS"})
{
acknowledged: true,
insertedId: ObjectId("61e7c8128845e822d33dab39")
}
mongo> db.dept.insertOne({"deptno":30,"deptname":"SALES","location":"CHICAGO"})
{
acknowledged: true,
insertedId: ObjectId("61e7c8158845e822d33dab3a")
}
mongo> db.dept.insertOne({"deptno":40,"deptname":"OPERATIONS","location":"BOSTON"})
{
acknowledged: true,
insertedId: ObjectId("61e7c8198845e822d33dab3b")
}
mongo>
コレクションdeptの内容を確認してみます。
mongo> db.dept.find()
[
{
_id: ObjectId("61e7c80d8845e822d33dab38"),
deptno: 10,
deptname: 'ACCOUNTING',
location: 'NEW YORK'
},
{
_id: ObjectId("61e7c8128845e822d33dab39"),
deptno: 20,
deptname: 'RESEARCH',
location: 'DALLAS'
},
{
_id: ObjectId("61e7c8158845e822d33dab3a"),
deptno: 30,
deptname: 'SALES',
location: 'CHICAGO'
},
{
_id: ObjectId("61e7c8198845e822d33dab3b"),
deptno: 40,
deptname: 'OPERATIONS',
location: 'BOSTON'
}
]
mongo>
検索条件を指定して、deptnoが10のJSONデータを抽出してみます。
mongo> db.dept.find({"deptno": 10})
[
{
_id: ObjectId("61e7c80d8845e822d33dab38"),
deptno: 10,
deptname: 'ACCOUNTING',
location: 'NEW YORK'
}
]
mongo>
同様に、deptnameがSALESのJSONデータを抽出してみます。
mongo> db.dept.find({"deptname": "SALES"})
[
{
_id: ObjectId("61e7c8158845e822d33dab3a"),
deptno: 30,
deptname: 'SALES',
location: 'CHICAGO'
}
]
mongo>
MongoDB Shellを終了します、
mongo> exit
4.Autonomous JSON Databaseの作成
MongoDB ShellからアクセスするAutonomous JSON Databaseを作成します。
OCIコンソールにアクセスします。
コンソールメニューから「Autonomous JSON Database」にアクセスします。
「
「Autonomous Databaseの作成」をクリックします。
Autonomous Databseの作成ウィザードが表示されます。
Autonomous JSON Databaseの表示名とデータベース名を入力します。
ワークロード・タイプは「JSON」を選択します。
ワークロード・タイプに「JSON」を選択すると、デプロイメント・タイプは共有インフラストラクチャのみとなります。
データベースの構成を指定します。
管理者ユーザ「ADMIN」のパスワードを入力します。
ネットワーク・アクセスのタイプを選択します。
「すべての場所からのセキュア・アクセス」を選択します。
Autonomous JSON Databaseではライセンス・タイプとして「ライセンス込み」のみが選択できます。
通知の送信先メールアドレスを入力します。
全ての入力が完了したら、「Autonomous Databaseの作成」をクリックします。
Autonomous JSON Databaseのプロビジョニングが開始されます。
数分待つと、Autonomous JSON Databaseが使用可能になります。
5.MongoDBクライアントアクセス用ユーザの作成とロールの付与
Autonomous JSON Databaseの詳細画面で「サービス・コンソール」をクリックします。
サービス・コンソールが表示されます。
「開発」をクリックします。
「データベース・アクション」をクリックします。
ユーザー名としてadminを入力して、「次」をクリックします。
adminユーザーのパスワードを入力して、「サインイン」をクリックします。
データベース・アクションが起動しました。
「管理」欄の「データベース・ユーザー」をクリックします。
ユーザー管理の画面が表示されます。
「ユーザーの作成」をクリックします。
「MONGO」ユーザーを作成します。
「Webアクセス」を有効化し、表領域の割当て制限は「UNLIMITED」とします。
「付与されたロール」タブをクリックして移動し、デフォルトで選択されている「CONNECT」、「RESOURCE」に加えて、「DWROLE」、「SODA_APP」を選択します。
最後に「ユーザーの作成」をクリックして、MONGOユーザーを作成します。
MONGOユーザーが作成されました。
6.Autonomous JSON Databaseのネットワーク・アクセスの変更
Autonomous JSON Databaseの詳細画面に戻ります。
アクセス制御リストの横の「編集」をクリックします。
IP表記法タイプに「IPアドレス」を選択し、値にMongoDBをインストールしたサーバ(Computeインスタンス)のグローバルIPアドレスを入力します。
入力が完了したら、「変更の保存」をクリックします。
Autonomous JSON Databaseが更新中になります。
少し待つとAutonomous JSON Databaseが使用可能になります。
ネットワークのアクセスタイプが「指定されたIPおよびVCNからのセキュアアクセスを許可」に変わり、アクセス制御リストが「有効」になります。
7.Oracle Database API for MongoDBの接続文字列の取得
「サービス・コンソール」をクリックします。
「開発」をクリックします。
「開発」のメニューが表示されます。
画面を下までスクロールすると「Oracle Database API for MongoDB」の欄が表示されるので、こちらの接続文字列をコピーしておきます。
MongoDBクライアントからAutonomous JSON Databaseに接続する際には、こちらの接続文字列を使用します。
接続文字列は以下のような形式になっています。
新しいMongoDBクライアント/ドライバの場合
mongodb://[user:password@]XXXXXXXXXX.adb.<region>.oraclecloudapps.com:27017/[user]?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true
それ以外の場合
mongodb://[user:password@]XXXXXXXXXX.adb.<region>.oraclecloudapps.com:27016/[user]?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false
8.MongoDB ShellからAutonomous JSON Databaseへのアクセス
準備が整ったので、MongoDB ShellからAutonomous JSON Databaseに接続してみます。
先ほどコピーした接続文字列のuserを先ほど作成したユーザー「mongo」に、passwordをmongoユーザのパスワードに置き換えて使用します。
なお、パスワードに次の文字が含まれている場合は、パーセント・エンコーディングする必要がありますので注意が必要です。
: / ? # [ ] @
[opc@work ~]$ mongosh 'mongodb://mongo:Demo%231Demo%231@XXXXXXXXXX.adb.ap-tokyo-1.oraclecloudapps.com:27017/mongo?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true'
Current Mongosh Log ID: 61e8ab854e5e3b975b80c535
Connecting to: mongodb://<credentials>@XXXXXXXXXX.adb.ap-tokyo-1.oraclecloudapps.com:27017/mongo?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true
Using MongoDB: 4.2.14
Using Mongosh: 1.1.8
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
mongo>
MongoDB ShellからAutonomous JSON Databaseに接続できました。
先ほどMongoDBに対して実行した操作を同じようにやってみます。
コレクションdeptを作成します。
mongo> db.createCollection('dept')
{ ok: 1 }
mongo>
コレクションdeptが作成されました。
作成されたコレクションを確認します。
mongo> show collections
dept
mongo>
コレクションdeptにJSONデータを追加します。
mongo> db.dept.insertOne({"deptno":10,"deptname":"ACCOUNTING","location":"NEW YORK"})
{
acknowledged: true,
insertedId: ObjectId("61e8ac1472062cfd73e14ecf")
}
mongo> db.dept.insertOne({"deptno":20,"deptname":"RESEARCH","location":"DALLAS"})
{
acknowledged: true,
insertedId: ObjectId("61e8ac1b72062cfd73e14ed0")
}
mongo> db.dept.insertOne({"deptno":30,"deptname":"SALES","location":"CHICAGO"})
{
acknowledged: true,
insertedId: ObjectId("61e8ac2072062cfd73e14ed1")
}
mongo> db.dept.insertOne({"deptno":40,"deptname":"OPERATIONS","location":"BOSTON"})
{
acknowledged: true,
insertedId: ObjectId("61e8ac2572062cfd73e14ed2")
}
mongo>
コレクションdeptの内容を確認します。
mongo> db.dept.find()
[
{
_id: ObjectId("61e8ac1472062cfd73e14ecf"),
deptno: 10,
deptname: 'ACCOUNTING',
location: 'NEW YORK'
},
{
_id: ObjectId("61e8ac1b72062cfd73e14ed0"),
deptno: 20,
deptname: 'RESEARCH',
location: 'DALLAS'
},
{
_id: ObjectId("61e8ac2072062cfd73e14ed1"),
deptno: 30,
deptname: 'SALES',
location: 'CHICAGO'
},
{
_id: ObjectId("61e8ac2572062cfd73e14ed2"),
deptno: 40,
deptname: 'OPERATIONS',
location: 'BOSTON'
}
]
mongo>
コレクションdeptから、条件を指定してJSONデータを抽出してみます。
mongo> db.dept.find({"deptno": 10})
[
{
_id: ObjectId("61e8ac1472062cfd73e14ecf"),
deptno: 10,
deptname: 'ACCOUNTING',
location: 'NEW YORK'
}
]
mongo> db.dept.find({"deptname": "SALES"})
[
{
_id: ObjectId("61e8ac2072062cfd73e14ed1"),
deptno: 30,
deptname: 'SALES',
location: 'CHICAGO'
}
]
mongo>
MongoDBに対する操作と同じ操作がAutonomous JSON Databaseに対して実行できることが確認できました。
MongoDB Shellを終了します、
mongo> exit
9.SQL*Plusでの確認
SQL*PlusからAutonomous JSON Databaseに接続して、MongoDB Shellから作成したコレクションdeptがどのように見えるのかを確認してみます。
[opc@work ~]$ sqlplus mongo/Demo#1Demo#1@ajd1_medium
SQL*Plus: Release 19.0.0.0.0 - Production on 木 1月 20 09:31:30 2022
Version 19.11.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
最終正常ログイン時間: 木 1月 20 2022 09:30:36 +09:00
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.1.0
に接続されました。
テーブルを確認します。
SQL> col tname for a20
SQL> SELECT tname FROM tab;
TNAME
--------------------
DEPT
Mongo Sellから作成したコレクションdeptがテーブルとして作成されています。
deptテーブルの構造を確認してみます。
SQL> desc dept
名前 NULL? 型
----------------------------------------- -------- ----------------------------
ID NOT NULL VARCHAR2(255)
CREATED_ON NOT NULL TIMESTAMP(6)
LAST_MODIFIED NOT NULL TIMESTAMP(6)
VERSION NOT NULL VARCHAR2(255)
JSON_DOCUMENT BLOB
deptテーブルはID、CREATED_ON、LAST_MODIFIED、VERSION、JSON_DOCUMENTの5つのカラムから構成されています。
Mongo Shellから挿入したJSONデータはBLOB型のJSON_DOCUMENTに格納されているようです。
JSON_SERIALIZEを使用して、格納されているJSONデータを確認してみます。
SQL> set linesize 200
SQL> SELECT JSON_SERIALIZE(json_document) FROM dept;
JSON_SERIALIZE(JSON_DOCUMENT)
--------------------------------------------------------------------------------
{"deptno":10,"deptname":"ACCOUNTING","location":"NEW YORK","_id":"61e8ac1472062cfd73e14ecf"}
{"deptno":20,"deptname":"RESEARCH","location":"DALLAS","_id":"61e8ac1b72062cfd73e14ed0"}
{"deptno":30,"deptname":"SALES","location":"CHICAGO","_id":"61e8ac2072062cfd73e14ed1"}
{"deptno":40,"deptname":"OPERATIONS","location":"BOSTON","_id":"61e8ac2572062cfd73e14ed2"}
SQL>
MongoDB Shellから挿入したJSONデータがjson_document列に格納されていることが確認できました。
参考情報
Oracle Help Center : Oracle Database API for MongoDB
Oracle Help Center : Using Oracle Database API for MongoDB
Oracle Database Insider : Oracle Database API for MongoDB
MongoDB Documentation : Connection String Issues