zoukankan      html  css  js  c++  java
  • 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。比如:

    Date
    Strict Mode mongo Shell Mode
    { "$date": "<date>" }
    
     
    new Date ( <date )
    OID
    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类型。

    参考文章: http://stackoverflow.com/questions/11867538/how-can-i-use-python-to-transform-mongodbs-bsondump-into-json

  • 相关阅读:
    使用NHibernate(1)--资料汇总
    mono上部署web程序初体验
    一次简单的ORM调研
    【设计模式】02-评判代码质量的标准?如何写出高质量代码?
    【设计模式】01-初识设计模式
    【ARTS】004-第四周(2020.06.15-2020.06.21)
    【leetcode】14-Longest Common Prefix
    【ARTS】003-第三周(2020.06.08-2020.06.14)
    【行成于思】04-读《如何超过大多数人》有感
    【leetcode】009-Palindrome Number
  • 原文地址:https://www.cnblogs.com/wangqiyu/p/6729470.html
Copyright © 2011-2022 走看看