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