MongoDB數(shù)據(jù)導(dǎo)入
本文介紹如何通過外表查詢MongoDB數(shù)據(jù),以及如何將MongoDB中的數(shù)據(jù)導(dǎo)入至云原生數(shù)據(jù)倉庫 AnalyticDB MySQL 版。
前提條件
AnalyticDB for MySQL集群的產(chǎn)品系列為企業(yè)版、基礎(chǔ)版或湖倉版。
已在AnalyticDB for MySQL控制臺集群信息頁面的網(wǎng)絡(luò)信息欄啟用ENI網(wǎng)絡(luò)開關(guān)。
MongoDB實例與AnalyticDB for MySQL所屬同一VPC。具體操作,請參見創(chuàng)建集群。
已將AnalyticDB for MySQL集群的VPC網(wǎng)段加入MongoDB實例的白名單中。具體操作,請參見修改白名單。
導(dǎo)入MongoDB非嵌套文檔
示例數(shù)據(jù)說明
本文示例的MongoDB數(shù)據(jù)庫名為test_mongodb
,并在該庫中創(chuàng)建名為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開發(fā)編輯器。
登錄云原生數(shù)據(jù)倉庫AnalyticDB MySQL控制臺,在左上角選擇集群所在地域。在左側(cè)導(dǎo)航欄,單擊集群列表,在企業(yè)版、基礎(chǔ)版或湖倉版頁簽下,單擊目標集群ID。
在左側(cè)導(dǎo)航欄,單擊 。
執(zhí)行以下語句,創(chuàng)建外部數(shù)據(jù)庫。示例如下:
CREATE EXTERNAL DATABASE adb_external_db;
創(chuàng)建外表。示例如下:
重要AnalyticDB for MySQL的外表和MongoDB文檔中的字段(field)名稱、字段數(shù)量、字段順序、數(shù)據(jù)類型必須相同。
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. 參數(shù)說明
參數(shù)
說明
mapped_name
MongoDB集合的名稱。本文示例中為
person
。location
MongoDB的專有網(wǎng)絡(luò)地址。如何獲取專有網(wǎng)絡(luò)的連接地址,請參見實例連接地址說明。
格式:
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時,請勿使用Secondary節(jié)點地址。
username
MongoDB數(shù)據(jù)庫的賬號。如何創(chuàng)建數(shù)據(jù)庫賬號,請參見MongoDB數(shù)據(jù)庫賬號權(quán)限管理。
說明MongoDB需要在目標數(shù)據(jù)庫中校驗數(shù)據(jù)庫的賬號和密碼,請使用MongoDB專有網(wǎng)絡(luò)地址中指定數(shù)據(jù)庫的賬號,如遇問題,請聯(lián)系技術(shù)支持。
password
MongoDB數(shù)據(jù)庫賬號的密碼。
查詢數(shù)據(jù)。
外表創(chuàng)建成功后,您可以使用SELECT語句查詢
person
集合中的數(shù)據(jù)。SELECT * FROM adb_external_db.person;
返回結(jié)果:
+------+-------+------+ | 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集群中創(chuàng)建數(shù)據(jù)庫和表,用于存儲從MongoDB中導(dǎo)入的數(shù)據(jù)。
創(chuàng)建名為
adb_demo
的數(shù)據(jù)庫。CREATE DATABASE adb_demo;
創(chuàng)建名為
adb_demo.adb_import_test
的數(shù)據(jù)表。重要AnalyticDB for MySQL企業(yè)版、基礎(chǔ)版及湖倉版中創(chuàng)建的表和AnalyticDB for MySQL外表中的字段名稱、字段數(shù)量、字段順序、數(shù)據(jù)類型必須相同。
CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test(id int,name varchar(1023),age int ) DISTRIBUTED BY HASH(id);
將MongoDB中的數(shù)據(jù)導(dǎo)入至AnalyticDB for MySQL企業(yè)版、基礎(chǔ)版及湖倉版中。
方法一:使用
INSERT INTO
語句導(dǎo)入數(shù)據(jù),當主鍵重復(fù)時會自動忽略當前寫入數(shù)據(jù),數(shù)據(jù)不做更新,作用等同于INSERT IGNORE INTO
,更多信息,請參見INSERT INTO。示例如下:INSERT INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
方法二:使用
INSERT OVERWRITE INTO
語句同步導(dǎo)入數(shù)據(jù),會覆蓋表中原有的數(shù)據(jù)。示例如下:INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
方法三:使用
INSERT OVERWRITE INTO
語句異步導(dǎo)入數(shù)據(jù),更多信息,請參見異步寫入。示例如下:SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
數(shù)據(jù)導(dǎo)入完成后,您可以使用SELECT語句查詢
adb_demo.adb_import_test
表中的數(shù)據(jù)。SELECT * FROM adb_demo.adb_import_test;
返回結(jié)果:
+------+-------+------+ | id | name | age | +------+-------+------+ | 1 | james | 10 | | 2 | bond | 20 | | 3 | jack | 30 | | 4 | lock | 40 | +------+-------+------+
查詢MongoDB嵌套文檔
示例數(shù)據(jù)
在數(shù)據(jù)庫test_mongodb
中創(chuàng)建名為test_json
的集合,示例如下:
db.createCollection("test_json");
向test_json
集合中插入文檔,其中city
和name
為嵌套字段,示例如下:
db.test_json.insert( {
'id': 1,
'details':{'city': "hangzhou", "name":"jack"}
})
操作步驟
進入SQL開發(fā)編輯器。
登錄云原生數(shù)據(jù)倉庫AnalyticDB MySQL控制臺,在左上角選擇集群所在地域。在左側(cè)導(dǎo)航欄,單擊集群列表,在企業(yè)版、基礎(chǔ)版或湖倉版頁簽下,單擊目標集群ID。
在左側(cè)導(dǎo)航欄,單擊 。
執(zhí)行以下語句,創(chuàng)建外部數(shù)據(jù)庫。示例如下:
CREATE EXTERNAL DATABASE adb_external_db;
創(chuàng)建外表。示例如下:
重要AnalyticDB for MySQL的外表和MongoDB文檔中的字段(field)名稱、字段數(shù)量、字段順序、數(shù)據(jù)類型必須相同。
不支持通過外表將數(shù)據(jù)寫入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", }';
參數(shù)說明:
COLUMN_MAPPING:定義外表字段與MongoDB字段的映射關(guān)系。例如:外表的
city
字段與MongoDB文檔的details.city
字段為映射關(guān)系。外表中其他參數(shù)的詳細說明,請參見參數(shù)說明。
查詢數(shù)據(jù)。
外表創(chuàng)建成功后,您可以使用SELECT語句查詢
test_json
集合中的數(shù)據(jù)。SELECT * FROM adb_external_db.test_json;
返回結(jié)果:
+------+----------+-------+ | id | city | name | +------+----------+-------+ | 1 | hangzhou | jack | +------+----------+-------+
說明如果要將MongoDB嵌套文檔導(dǎo)入到AnalyticDB for MySQL中,需要先創(chuàng)建用于存儲MongoDB嵌套文檔的數(shù)據(jù)庫和數(shù)據(jù)表,具體操作,請參見導(dǎo)入MongoDB非嵌套文檔中的步驟5~7。
查詢ObjectId字段
示例數(shù)據(jù)
在數(shù)據(jù)庫test_mongodb
中創(chuàng)建名為test_objectid
的集合,示例如下:
db.createCollection("test_objectid");
向test_objectid
集合中插入文檔,示例如下:
db.test_objectid.insert( {
'id': 1,
})
查詢test_objectid
集合中的文檔,示例如下:
db.test_objectid.find()
返回結(jié)果:
{
"_id":"ObjectId("641002ad883a73eb0d7291a7")"
"id":1
}
操作步驟
進入SQL開發(fā)編輯器。
登錄云原生數(shù)據(jù)倉庫AnalyticDB MySQL控制臺,在左上角選擇集群所在地域。在左側(cè)導(dǎo)航欄,單擊集群列表,在企業(yè)版、基礎(chǔ)版或湖倉版頁簽下,單擊目標集群ID。
在左側(cè)導(dǎo)航欄,單擊 。
執(zhí)行以下語句,創(chuàng)建外部數(shù)據(jù)庫。示例如下:
CREATE EXTERNAL DATABASE adb_external_db;
創(chuàng)建外表。示例如下:
重要AnalyticDB for MySQL的外表和MongoDB文檔中的字段(field)名稱、字段數(shù)量、字段順序、數(shù)據(jù)類型必須相同。
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", }';
查詢數(shù)據(jù)。
外表創(chuàng)建成功后,您可以使用SELECT語句查詢
test_objectid
集合中的數(shù)據(jù)。SELECT cast(_id as string) FROM adb_external_db.test_objectid;
返回結(jié)果:
+----------------------------+ | CAST(_id AS string) | +----------------------------+ | 641002ad883a73eb0d7291a7 | +----------------------------+
說明如果要將ObjectId字段導(dǎo)入到AnalyticDB for MySQL中,需要先創(chuàng)建用于存儲ObjectId字段的數(shù)據(jù)庫和數(shù)據(jù)表,具體操作,請參見導(dǎo)入MongoDB非嵌套文檔中的步驟5~7。
外表支持的數(shù)據(jù)類型
AnalyticDB for MySQL外表 | MongoDB數(shù)據(jù)表 |
Boolean | Boolean |
ObjectId | ObjectId |
String | String |
Int | 32-bit Integer、Int |
Bigint | 64-bit Integer Long |
Double | Double |
Date | Date |