MongoDB用BSON作為基礎數據類型,用來存儲JSON文檔和在進行遠程調用時的網絡傳輸數據格式。BSON是指Binary JSON,有類似JSON的數據格式,還支持其他如Date類型,有編解碼快等優點。
博主通過讀資料和實驗確定可行的一個MongoDB數據遷移至MySQL的方案:
- MongoDB數據遷移可通過mongodump命令導出一批BSON文件
。
- bsondump命令將BSON文件轉化成JSON文件。但根據MongoDB Extended JSON,MongoDB為了支持自身數據類型,對JSON格式做了一些擴展,有以下兩種模式:
- Strict mode
- mongo Shell mode
文中指出Strict mode適用於所有JSON解析工具,而mongo Shell mode只能被MongoDB內部的解析器識別。而bsondump的輸出格式就是mongo Shell mode,所以需要將輸出結果中的某些結構改成Strict mode。比如:
Strict Mode | mongo Shell Mode | |
---|---|---|
{ "$date": "<date>" }
|
new Date ( <date )
|
Strict Mode | mongo Shell Mode | |
---|---|---|
{ "$oid": "<id>" }
|
ObjectId( "<id>" )
|
- Python 正則表達式轉化JSON格式(參考json庫和json_util庫), bson庫的安裝方式:
# apt-get install python-pip # python -m pip install pymongo
測試Python腳本:
-
1 import json, re 2 from bson import json_util 3 4 with open("app.json", "r") as f: 5 for jsondata in f: 7 jsondata = re.sub(r'ObjectId\s*\(\s*\"(\S+)\"\s*\)', 8 r'{"$oid": "\1"}', 9 jsondata) 10 jsondata = re.sub(r'Date\s*\(\s*(\S+)\s*\)', 11 r'{"$date": \1}', 12 jsondata) 13 14 # use MongoDB's object_hook function to get 15 # rich Python data structures inside a dictionary 16 data = json.loads(jsondata, object_hook=json_util.object_hook) 17 18 # print(data) 19 print type(data['createTime']) 20 print data['createTime'] 21 print type(data['appName']) 22 print data['appName'].encode('utf-8')
對於有多個JSON對象的bson文件,輸出結果類似:
<type 'datetime.datetime'>
2017-04-11 16:30:58.008000+00:00
<type 'unicode'>
公交無線
<type 'datetime.datetime'>
2017-04-11 17:09:05.321000+00:00
<type 'unicode'>
rew
<type 'datetime.datetime'>
2017-04-11 17:42:52.398000+00:00
<type 'unicode'>
攜程
可以看到最后得到了一個dict,可以后續操作導出的數據,比如導入MySQL數據庫。value的類型都得到保留,比如Date類型,而字符串類型的都轉成了unicode類型。