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'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類型。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM