Python之讀取MongoDB導(dǎo)出的BSON文件
BSON是一種類似于JSON的二進制形式的存儲格式,簡稱Binary JSON,它和JSON一樣,支持內(nèi)嵌的文檔對象和數(shù)組對象,但是BSON有JSON沒有的一些數(shù)據(jù)類型,如Date和BinData類型等。
BSON主要被用作MongoDB數(shù)據(jù)庫中的數(shù)據(jù)存儲和網(wǎng)絡(luò)傳輸格式,能用來表示簡單數(shù)據(jù)結(jié)構(gòu)、關(guān)聯(lián)數(shù)組(MongoDB中稱為“對象”或“文檔”)以及MongoDB中的各種數(shù)據(jù)類型。
本文將講述如何使用Python來讀取MongoDB導(dǎo)出的BSON文件。
使用MongoDB導(dǎo)出BSON文件
使用Studio 3T軟件查看數(shù)據(jù)庫,其中testdb中的內(nèi)容如下:

我們使用Studio 3T軟件的Export功能,將該數(shù)據(jù)庫的內(nèi)容以BSON格式導(dǎo)出,如下圖:

導(dǎo)出文件成功后,我們解壓壓縮包,即可獲得teacher.bson文件。
bson模塊讀取BSON文件
我們使用bson文件來讀取teacher.bson文件,代碼如下:
#?-*-?coding:?utf-8?-*-
import?bson
bson_file?=?open('teacher.bson',?'rb')
bson_data?=?bson.loads(bson_file.read())
print(bson_data)
輸出結(jié)果如下:
{'_id':?b'5f5f9304d18befbe1149fdba',?'name':?'zhanshan',?'age':?25}
代碼只能讀取BSON文件的第一個數(shù)據(jù)!這是什么原因呢?
查看bson.loads源代碼,如下:
def?loads(data):
????"""
????????Given?a?BSON?string,?outputs?a?dict.
????"""
????return?decode_document(data,?0)[1]
在源代碼中,我們發(fā)現(xiàn)該函數(shù)確實只返回了第一個數(shù)據(jù)。這樣的結(jié)果不能讓人滿意。
那么解決辦法是什么呢?
使用pymongo讀取BSON文件
我們先安裝pymongo模塊,讀取teacher.bson文件的代碼如下:
#?-*-?coding:?utf-8?-*-
import?bson
bson_file?=?open('teacher.bson',?'rb')
bson_data?=?bson.decode_all(bson_file.read())
print(type(bson_data))
for?data?in?bson_data:
????print(data)
輸出結(jié)果如下:
<class?'list'>
{'_id':?ObjectId('5f5f9304d18befbe1149fdba'),?'name':?'zhanshan',?'age':?25}
{'_id':?ObjectId('5f5f9304d18befbe1149fdbb'),?'name':?'lisi',?'age':?36}
{'_id':?ObjectId('5f5f9304d18befbe1149fdbc'),?'name':?'wangwu',?'age':?27}
現(xiàn)在我們已經(jīng)讀取了teacher.bson中的全部數(shù)據(jù)!
本文來自于筆者在工作中碰到的一個讀取BSON文件的困惑,故記錄于此。
更多閱讀
特別推薦

點擊下方閱讀原文加入社區(qū)會員
