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

 

posted @ 2016-09-07 11:26  那一剑的風情  阅读(11362)  评论(0编辑  收藏  举报