將 MongoDB 導出成 csv

【摘要】


將 Mongodb 數據結構轉換成結構化的數據需求,我們可利用集算器 SPL 語言來進行輔助實現。若想了解更多,請前往乾學院:將 MongoDB 導出成 csv!

來源:https://plus.google.com/+VicNgrail/posts/ebS9JUtFopw Mongodb 可以存儲非結構化數據,尤其擅長存儲 json 格式的數據。對於習慣於數據庫表結構的用戶或需要使用結構化數據的用戶來說,往往希望能將非結構化的數據轉換成結構化的數據,以方便後面的計算,而要將這些數據導出為標準的結構化數據經常存在一定的困難。針對這種情況,我們可以利用集算器 SPL 語言來輔助 MongoDB,方便地導出結構化數據,下面用例子說明。


Collection carInfo 的部分數據如下:
{
“_id” : ObjectId(“5518f6f8a82a704fe4216a43”),
“id” : “No1”,
“cars” : {
“name” : “Putin”,
“car” : [“porche”, “bmw”]
}
}

{
“_id” : ObjectId(“5518f745a82a704fe4216a44”),
“id” : “No2”,
“cars” : {
“name” : “jack”,
“car” : [“Toyota”, “Jetta”, “Audi”]


}
}
……


需要將其導出為CSV文件,期望的數據格式如下:


將 MongoDB 導出成 csv


使用集算器SPL的代碼如下:

A 1 =mongo_open("mongodb://localhost:27017/local?user=test&password=test") 2 =mongo_shell(A1,"carInfo.find(,{_id:0})") 3 =A2.conj((t=~,~.cars.car.new(t.id:id, t.cars.name:name, ~:car))) 4 =file("D:\\\\data.csv").export@t(A3;",") 5 >mongo_close(A1)

A1: 連接MongoDB,連接字格式為mongo://ip:port/db?arg=value&…

A2: 使用find函數從集合carInfo中取數,形成遊標。過濾條件是空,取出_id之外的所有字段。

A3: 取出需要的字段,拼接合成結構化二維表,結果仍然是遊標。其中~表示A2中的每個document,並對cars.car字段進行拆分成行後組成序表,函數conj表示對序表縱向合併。

A4: 將A3導出為逗號分隔的csv文件,其中@t表示導出時帶列名。SPL引擎會自動管理緩存,每次從遊標取一批記錄到內存進行計算。

A5: 關閉MongoDB。

如果用戶想自己管理每批處理的數據,也可以用下面的代碼:

A B 1 =mongo_open("mongodb://localhost:27017/local?user=test&password=test") 2 =mongo_shell(A1,"carInfo.find(,{_id:0})") 3 for A2,1000 =A3.cars.car.new(A3.id:id, A3.cars.name:name, ~:car) 4 =file("D:\\\\data.csv").export@ta(B3;",") 5 >mongo_close(A1)

A3: 循環從遊標讀數,每次讀1000條到內存。A3的作用範圍是縮進的B3到B4,其間可以用A3來引用循環變量。A3中的數據如下:

將 MongoDB 導出成 csv

B3:將本批次數據轉換為結構化二維表,如下:


將 MongoDB 導出成 csv

B4:將本批次的計算結果追加到文件中,其中@a表示數據追加。

簡言之,SPL得到數據集合的遊標後,將每個document按car字段拆分後組成序表,將序表合併或以追加方式保存為文件即可。顯然,對於這類非結構化數據向結構化數據的轉換,SPL語言的處理非常高效且簡明。


分享到:


相關文章: