[OCI]Autonomous Database : MongoDB Atlasに対するデータベース・リンクを作成してデータを参照してみた


# 1. MongoDBの準備
今回はMongoDB Atlasのトライアル環境環境を使用して、MongoDBを準備しました。

https://www.mongodb.com/cloud/atlas/lp/try4

こちらの手順に沿ってアカウントを取得し、クラスターをデプロイしました。

https://www.mongodb.com/docs/atlas/getting-started/

クラスター内にデータベースsample_databaseを作成し、sample_database内にコレクションsample_deptを作成しました。
また、sample_dept内に以下の4つのドキュメントを準備しました。
```
{
 "_id":{"$oid":"63509a3c8b416188cff4055c"},
 "deptno":"10",
 "deptname":"ACCOUNTING",
 "location":"NEW YORK",
 "address":{"building":"Tower A","zipcode":"11111"}
}

{
 "_id"{"$oid":"63509af78b416188cff4055d"},
 "deptno":"20",
 "deptname":"RESEARCH",
 "location":"DALLAS",
 "address":{"zipcode":"22222","building":"Tower B"}
}

{
 "_id":{"$oid":"63509b5a8b416188cff4055e"},
 "deptno":"30",
 "deptname":"SALES",
 "location":"CHICAGO",
 "address":{"zipcode":"33333","building":"Tower C"}
}

{
 "_id":{"$oid":"63509bb78b416188cff4055f"},
 "deptno":"40",
 "deptname":"OPERATIONS",
 "location":"BOSTON",
 "address":{"zipcode":"44444","building":"Tower D"}
}
```
MongoDB Atlasのコンソールでsample_deptの内容を再度確認してみます。
![スクリーンショット 2022-10-20 13.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5af89b4c-2056-d472-909f-6c362a98dffa.png)
addressはオブジェクト型になっており、buildingとzipcodeの2つのフィールドが含まれています。、
![スクリーンショット 2022-10-20 13.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/51d0a6c3-392a-4e40-f3c6-ffbcf4119cc2.png)

# 2. Autonomous DatabaseのアウトバウンドIPアドレスの確認

MongoDB側でAutonomous Databaseからの接続を許可する設定を行うために、以下のSQLでAutonomous DatabaseのアウトバウンドIPアドレスを確認します。
```
SELECT json_value(cloud_identity, '$.OUTBOUND_IP_ADDRESS[0]') outbound_ip_address FROM v$pdbs;
```
では、実行して確認してみます。
```
SQL> SELECT json_value(cloud_identity, '$.OUTBOUND_IP_ADDRESS[0]') outbound_ip_address FROM v$pdbs;

OUTBOUND_IP_ADDRESS
--------------------------------------------------------------------------------
xxx.xxx.xxx.xxx

SQL>
```
出力されたIPアドレスをメモしておきます。

# 3. MongoDB Atlasのネットワークセキュリティの設定
先ほど確認したAutonomous DatabaseのアウトバウンドIPアドレスからの接続を許可する設定を行います。

MongoDBのコンソールから「Network Access」に移動します。
![スクリーンショット 2022-10-20 13.14.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/04ebe398-2f8a-0c5e-7690-e933c9a0d99a.png)
「ADD IP ADDRESS」をクリックします。
![スクリーンショット 2022-10-20 13.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ae932b19-81f8-6a2c-cc48-defc8bcc42ff.png)
以下を入力して、「Confirm」をクリックします。
Acess List Entry：Autonomous DatabaseのアウトバウンドIPアドレス
Comment：Autonomous Database（任意）
![スクリーンショット 2022-10-20 13.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/873b298b-25d3-e27b-e6a3-fd15efb5fbcf.png)
Autonomous DatabaseのアウトバウンドIPアドレスからの接続を許可するルールが追加されました。
![スクリーンショット 2022-10-20 13.10.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/447185b1-2a66-02c0-3ea9-5132fb99a3d3.png)

# 4. MongoDBにアクセスするためのクレデンシャルの作成
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、クレデンシャルを作成します。
```
SQL> BEGIN
  2    DBMS_CLOUD.CREATE_CREDENTIAL(
  3      credential_name => 'MONGODB_LINK_CRED',
  4      username => 'atlasuser',
  5      password => 'Oracle1'
  6    );
  7  END;
  8  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

# 5. MongoDBに対するデータベース・リンクの作成
DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKを使用して、MongoDBのデータベースsample_databaeへのデータベースリンクを作成します。
```
SQL> BEGIN
  2       DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
  3            db_link_name => 'MONGODB_LINK', 
  4            hostname => 'cluster0.xxxxxx.mongodb.net', 
  5            port => '27017',
  6  		  service_name => 'sample_database',
  7            credential_name => 'MONGODB_LINK_CRED',
  8            gateway_params => JSON_OBJECT('db_type' value 'MONGODB'),
  9            ssl_server_cert_dn => NULL);
 10  END;
 11  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```
MongoDBのデータベースsample_database内のコレクションsample_deptが、Autonomous Database側でどのように見えるかを確認してみます。
```
SQL> desc sample_dept@MONGODB_LINK;
 名前                                       NULL?    型
 ----------------------------------------- -------- ----------------------------
 _ID					                   NOT NULL NVARCHAR2(24)
 DEPTNO 					                        NVARCHAR2(3)
 DEPTNAME					                        NVARCHAR2(15)
 LOCATION					                        NVARCHAR2(12)
 ADDRESS_BUILDING				                    NVARCHAR2(10)
 ADDRESS_ZIPCODE				                    NVARCHAR2(7)

SQL>
```
MongoDBにObjectとして保存されているaddress内のフィールドは、address_building、address_zipcodeとして展開されていることがわかりました。

MongoDBのデータベースsample_database内のコレクションsample_deptに対してSELECT文を実行してみます。
```
SQL> set pagesize 100
SQL> SELECT * FROM sample_dept@MONGODB_LINK;


_ID
--------------------------------------------------------------------------------
DEPTNO	     DEPTNAME
------------ ------------------------------------------------------------
LOCATION
------------------------------------------------
ADDRESS_BUILDING			             ADDRESS_ZIPCODE
---------------------------------------- ----------------------------
63509A3C8B416188CFF4055C
10	     ACCOUNTING
NEW YORK
Tower A 				                 11111

63509AF78B416188CFF4055D
20	     RESEARCH
DALLAS
Tower B 				                 22222

63509B5A8B416188CFF4055E
30	     SALES
CHICAGO
Tower C 				                 33333

63509BB78B416188CFF4055F
40	     OPERATIONS
BOSTON
Tower D 				                 44444


SQL>
```
作成したデータベース・リンク経由で、MongoDB Atlasのデータベースsample_database内のコレクションsample_deptの内容が参照できることが確認できました。

# 参考資料
[Create Database Links to Non-Oracle Databases with Oracle-Managed Heterogeneous Connectivity](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5)