MongoDB csv文件導入導出


1.導出到csv文件:

  

  需要登錄認證的:

mongoexport -h 127.0.0.1:27017 -u root -p 123456 --authenticationDatabase admin -d IndicatorPlatform -c calcgsdataflash -q{gscode:'ZTJB',ymd:{$gte:20190801,$lte:20190820}} --type csv -f gscode,gpcode,ymd,hms,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,time -o D:\tmp\ZTJB_20190820.csv

  

 

2.從csv導入:

  

  需要登錄認證的:

mongoimport -h 127.0.0.1:27017 -u root -p 123456 --authenticationDatabase admin -d IndicatorPlatform -c calcgsdataflash --type csv --headerline --file D:/tmp/ZTJB_20180716.csv

  

 

 

數據經過csv導出導入,有一個非常隱蔽的問題,編寫代碼時需要注意:

  先導入一條數據:

    

其中Price是double類型:

    

然后我把該條記錄導出到Demo.csv,並且從數據庫刪除該條記錄,然后再從Demo.csv導入該條記錄:

    

再來看此時數據庫中該條記錄:

    

  發現Price數值原本double型66.000000自動變成了Int32型66。

  這時問題出現了,你如果還是用bson_iter_double(&iter)去取Price字段時,就會取不到值:

    

  只有用bson_iter_int32(&iter)才能取到值:

    

  所以得到結論

    當需要取數據中的某個float(或double)類型的字段時,代碼可以如下編寫:

    

    避免:數據經過 導出至csv再從csv導入的過程之后,字段值取不到的問題。

 

  總覺的上面的方法有點膈應,所以繼續摸索,發現了2個新的API:

  測試代碼編寫如下:

  

 

  本以為bson_iter_value(&iter)->value.v_double 就可以解決問題,可斷點發現如果是字段是Int32型,v_double的值並不能滿足要求。

  如果要用這兩個API,還得自己封裝一層,把type和value對應起來。

  如:字段是BSON_TYPE_INT32就取value.v_int32的值; 是BSON_TYPE_DOUBLE就取value.v_double的值。

  

  仍然覺得上述方法很不爽,總是想尋求一種不依賴字段本身數據類型的取值方法。

  終於,Json完美滿足了我的需求,測試代碼如下:

  

  上述Json解析使用的是Jsoncpp,Jsoncpp使用方法詳見

  http://www.cnblogs.com/SZxiaochun/p/5866401.html

  http://www.cnblogs.com/SZxiaochun/p/7684454.html

 


免責聲明!

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



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