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'ObjectIds*(s*"(S+)"s*)', 8 r'{"$oid": "1"}', 9 jsondata) 10 jsondata = re.sub(r'Dates*(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类型。