本トピックでは、外部テーブルを使用して MongoDB データをクエリし、そのデータを AnalyticDB for MySQL にインポートする方法について説明します。
前提条件
-
AnalyticDB for MySQL クラスターが Enterprise Edition、Basic Edition、または Data Lakehouse Edition であること。
-
AnalyticDB for MySQL コンソールの [Cluster Information] ページの [Network Information] セクションで、[ENI Network] スイッチが有効になっていること。
重要ENI ネットワークを有効または無効にすると、データベース接続が約 2 分間中断されます。 この期間中は、読み取りおよび書き込み操作を実行できません。 ENI ネットワークを有効または無効にする前に、影響を慎重に評価してください。
-
MongoDB インスタンスと AnalyticDB for MySQL クラスターが同じ VPC 内にあること。
-
AnalyticDB for MySQL クラスターの VPC CIDR ブロックが、MongoDB インスタンスの ホワイトリスト に追加されていること。
MongoDB のネストされていないドキュメントからのデータインポート
サンプルデータ
この例では、MongoDB インスタンスの test_mongodb データベースに person という名前のコレクションを作成します。
use test_mongodb;
db.createCollection("person");
person コレクションにドキュメントを挿入します。
db.person.insert({"id":1,"name":"james","age":10});
db.person.insert({"id":2,"name":"bond","age":20});
db.person.insert({"id":3,"name":"jack","age":30});
db.person.insert({"id":4,"name":"lock","age":40});
操作手順
-
SQL 開発エディターに移動します。
-
AnalyticDB for MySQL コンソールにログインします。 画面左上で、クラスターが存在するリージョンを選択します。 左側メニューで、[Clusters] をクリックし、対象クラスターの ID をクリックします。
-
左側メニューで、[ジョブ開発] > [SQL Development] を選択します。
-
-
次のステートメントを実行して、外部データベースを作成します。
CREATE EXTERNAL DATABASE adb_external_db; -
外部テーブルを作成します。
重要AnalyticDB for MySQL の外部テーブルは、MongoDB ドキュメントと、フィールド名、フィールド数、フィールド順序、およびデータ型が同じである必要があります。
CREATE EXTERNAL TABLE adb_external_db.person ( id int, name string, age int ) ENGINE = 'MONGODB' TABLE_PROPERTIES ='{ "mapped_name":"person", "location":"mongodb://testuser:****@dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717,dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717/test_mongodb", "username":"testuser", "password":"password", }';表 1. パラメーター
パラメーター
説明
mapped_name
MongoDB コレクションの名前。 この例では、名前は
personです。location
ApsaraDB for MongoDB インスタンスの VPC エンドポイント。
形式:
mongodb://testuser:****@dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717,dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717/database例:
mongodb://testuser:****@dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717,dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717/test_mongodb説明セカンダリノードのエンドポイントを使用して MongoDB インスタンスに接続しないでください。
username
説明MongoDB は、宛先データベースのアカウントとパスワードを検証します。 MongoDB インスタンスの VPC エンドポイントで指定されたデータベースのアカウントを使用してください。 ご不明な場合は、テクニカルサポートにお問い合わせください。
password
MongoDB データベースアカウントのパスワード。
-
データをクエリします。
外部テーブルの作成後、SELECT ステートメントを使用して
personコレクションのデータをクエリできます。SELECT * FROM adb_external_db.person;次の結果が返されます。
+------+-------+------+ | id | name | age | +------+-------+------+ | 1 | james | 10 | | 2 | bond | 20 | | 3 | jack | 30 | | 4 | lock | 40 | +------+-------+------+ 4 rows in set (0.35 sec) -
AnalyticDB for MySQL クラスターにデータベースとテーブルを作成して、MongoDB からインポートされたデータを格納します。
-
adb_demoという名前のデータベースを作成します。CREATE DATABASE adb_demo; -
adb_demo.adb_import_testという名前のテーブルを作成します。重要AnalyticDB for MySQL の Enterprise Edition、Basic Edition、または Data Lakehouse Edition クラスターで作成されるテーブルは、AnalyticDB for MySQL の外部テーブルと、フィールド名、フィールド数、フィールド順序、およびデータ型が同じである必要があります。
CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test(id int,name varchar(1023),age int ) DISTRIBUTED BY HASH(id);
-
-
MongoDB から AnalyticDB for MySQL の Enterprise Edition、Basic Edition、または Data Lakehouse Edition クラスターにデータをインポートします。
-
方法 1:
INSERT INTOステートメントを使用してデータをインポートします。 プライマリキーの値が重複している場合、新しいデータは無視されます。 これはINSERT IGNORE INTOと同等です。 詳細については、「INSERT INTO」をご参照ください。INSERT INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
方法 2:
INSERT OVERWRITE INTOステートメントを使用して、データを同期的にインポートします。 これにより、テーブル内の既存のデータが上書きされます。INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
方法 3:
INSERT OVERWRITE INTOステートメントを使用して、データを非同期でインポートします。 詳細については、「非同期書き込み」をご参照ください。SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
-
-
データがインポートされた後、SELECT ステートメントを使用して
adb_demo.adb_import_testテーブルのデータをクエリできます。SELECT * FROM adb_demo.adb_import_test;次の結果が返されます。
+------+-------+------+ | id | name | age | +------+-------+------+ | 1 | james | 10 | | 2 | bond | 20 | | 3 | jack | 30 | | 4 | lock | 40 | +------+-------+------+
MongoDB のネストされたドキュメントのクエリ
サンプルデータ
test_mongodb データベースに、test_json という名前のコレクションを作成します。
db.createCollection("test_json");
test_json コレクションにドキュメントを挿入します。 city および name フィールドはネストされたフィールドです。
db.test_json.insert( {
'id': 1,
'details':{'city': "hangzhou", "name":"jack"}
})
操作手順
-
SQL 開発エディターに移動します。
-
AnalyticDB for MySQL コンソールにログインします。 画面左上で、クラスターが存在するリージョンを選択します。 左側メニューで、[Clusters] をクリックし、対象クラスターの ID をクリックします。
-
左側メニューで、[ジョブ開発] > [SQL Development] を選択します。
-
-
次のステートメントを実行して、外部データベースを作成します。
CREATE EXTERNAL DATABASE adb_external_db; -
外部テーブルを作成します。
重要-
AnalyticDB for MySQL の外部テーブルは、MongoDB ドキュメントと、フィールド名、フィールド数、フィールド順序、およびデータ型が同じである必要があります。
-
外部テーブルを使用して MongoDB のネストされたドキュメントにデータを書き込むことはできません。
CREATE EXTERNAL TABLE adb_external_db.test_json ( id int, city string, name string ) ENGINE = 'MONGODB' TABLE_PROPERTIES ='{ "mapped_name":"test_json", "location":"mongodb://testuser:****@dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717,dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717/test_mongodb", "username":"testuser", "password":"password", "COLUMN_MAPPING":"city,details.city;name,details.name", }';パラメーター:
-
COLUMN_MAPPING: 外部テーブルのフィールドと MongoDB ドキュメントのフィールド間のマッピングを定義します。 たとえば、外部テーブルのcityフィールドと MongoDB ドキュメントのdetails.cityフィールドの間にマッピングが作成されます。 -
外部テーブルのその他のパラメーターについては、「パラメーターの説明」をご参照ください。
-
-
データをクエリします。
外部テーブルの作成後、SELECT ステートメントを使用して
test_jsonコレクションのデータをクエリできます。SELECT * FROM adb_external_db.test_json;次の結果が返されます。
+------+----------+-------+ | id | city | name | +------+----------+-------+ | 1 | hangzhou | jack | +------+----------+-------+説明MongoDB のネストされたドキュメントから AnalyticDB for MySQL にデータをインポートするには、まずデータベースとテーブルを作成する必要があります。 詳細については、本トピックの「MongoDB のネストされていないドキュメントからのデータインポート」セクションの手順5~7をご参照ください。
ObjectId フィールドのクエリ
サンプルデータ
test_mongodb データベースに、test_objectid という名前のコレクションを作成します。
db.createCollection("test_objectid");
test_objectid コレクションにドキュメントを挿入します。
db.test_objectid.insert( {
'id': 1,
})
test_objectid コレクション内のドキュメントをクエリします。
db.test_objectid.find()
次の結果が返されます。
{
"_id":"ObjectId("641002ad883a73eb0d7291a7")",
"id":1
}
操作手順
-
SQL 開発エディターに移動します。
-
AnalyticDB for MySQL コンソールにログインします。 画面左上で、クラスターが存在するリージョンを選択します。 左側メニューで、[Clusters] をクリックし、対象クラスターの ID をクリックします。
-
左側メニューで、[ジョブ開発] > [SQL Development] を選択します。
-
-
次のステートメントを実行して、外部データベースを作成します。
CREATE EXTERNAL DATABASE adb_external_db; -
外部テーブルを作成します。
重要AnalyticDB for MySQL の外部テーブルは、MongoDB ドキュメントと、フィールド名、フィールド数、フィールド順序、およびデータ型が同じである必要があります。
CREATE EXTERNAL TABLE adb_external_db.test_objectid ( id int, _id objectid ) ENGINE = 'MONGODB' TABLE_PROPERTIES ='{ "mapped_name":"test_objectid", "location":"mongodb://testuser:****@dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717,dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717/test_mongodb", "username":"testuser", "password":"password", }'; -
データをクエリします。
外部テーブルの作成後、SELECT ステートメントを使用して
test_objectidコレクションのデータをクエリできます。SELECT cast(_id as string) FROM adb_external_db.test_objectid;結果の例:
+----------------------------+ | CAST(_id AS string) | +----------------------------+ | 641002ad883a73eb0d7291a7 | +----------------------------+説明ObjectId フィールドを含むデータを AnalyticDB for MySQL にインポートするには、まずデータを格納するためのデータベースとテーブルを作成する必要があります。 詳細については、「MongoDB のネストされていないドキュメントからのデータインポート」の手順5~7をご参照ください。
AnalyticDB for MySQL の外部テーブルと MongoDB コレクション間のデータ型マッピング
|
AnalyticDB for MySQL 外部テーブル |
MongoDB コレクション |
|
Boolean |
Boolean |
|
ObjectId |
ObjectId |
|
String |
String |
|
Int |
32 ビット整数 (Int) |
|
Bigint |
64 ビット整数 (Long) |
|
Double |
Double |
|
Date |
Date |