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