shirobert 发表于 2017-12-16 06:22:19

MongoDB用BSON文件做数据迁移

  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。比如:

DateStrict Mode mongo Shell Mode  

{ "$date": "<date>" }  

  

  

new Date ( <date )  



OIDStrict 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脚本:


[*]  

import json, re  

from bson import json_util  

  
with open("app.json", "r") as f:
  
   for jsondata in f:
  
         jsondata = re.sub(r'ObjectId\s*\(\s*\"(\S+)\"\s*\)',
  
                           r'{"$oid": "\1"}',
  
                           jsondata)
  
         jsondata = re.sub(r'Date\s*\(\s*(\S+)\s*\)',
  
                           r'{"$date": \1}',
  
                           jsondata)
  

  
         # use MongoDB's object_hook function to get
  
         # rich Python data structures inside a dictionary
  
         data = json.loads(jsondata, object_hook=json_util.object_hook)
  

  
         # print(data)
  
         print type(data['createTime'])
  
         print data['createTime']
  
         print type(data['appName'])
  
         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类型。
  参考文章: http://stackoverflow.com/questions/11867538/how-can-i-use-python-to-transform-mongodbs-bsondump-into-json
页: [1]
查看完整版本: MongoDB用BSON文件做数据迁移