將 MongoDB 導出成 csv

原文鏈接:http://c.raqsoft.com.cn/article/1568624571679?r=CGQ

 

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文件,期望的數據格式如下:

 

   a_100png

 

使用集算器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中的數據如下:

a_101png

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

 

a_102png

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章