说明

将mongo的数据导出为csv文件

内容

我是用容器方式启动的mongo,如果用本机启动的跳过第一步

1 进入容器

  • 1 查询当前容器
docker ps
  • 2 进入容器
docker exec -it b0d64d7de440 /bin/bash

2 进入mongo

确保存在且运行

root@b0d64d7de440:/# whereis mongo
mongo: /usr/bin/mongo

执行导出命令,如果是有密码的数据执行(没有密码的化从-d开始就可以)

mongoexport --authenticationDatabase YOURAUTHDB  -u xxx -p xxx -d YOURDB -c YOURCollection --type=csv --out /home/test.csv --fields 'var_id,var_name'

还可以执行筛选
参考这篇文章

# 直接从某个表导出期望字段,生成CSV
mongoexport --host 10.8.8.111 --db sampleData --collection eventV4 --csv --out events.csv --fields '_id,something'

# 增加一个检索filter后导出CSV
mongoexport --host 10.8.8.111 --db sampleData --collection eventV4 --queryFile ./range.json --csv --out events.csv --fields '_id,something'

# cat range.json
{"something":{"$gt":1}}

也可以直接使用query语句,类似--query '{"createDate":{"$gt":1558160048000}}'

mongo的csv导出不能更改分隔符,也不能加双引号,可能比较适合数值型,id型的导出

3 其他方法

可以参考这篇文章

参数说明:

-h,--host :代表远程连接的数据库地址,默认连接本地Mongo数据库;
--port:代表远程连接的数据库的端口,默认连接的远程端口27017;
-u,--username:代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号;
-p,--password:代表连接数据库的账号对应的密码;
-d,--db:代表连接的数据库;
-c,--collection:代表连接数据库中的集合;
-f, --fields:代表集合中的字段,可以根据设置选择导出的字段;
--type:代表导出输出的文件类型,包括csv和json文件;
-o, --out:代表导出的文件名;
-q, --query:代表查询条件;
 --skip:跳过指定数量的数据;
--limit:读取指定数量的数据记录;
--sort:对数据进行排序,可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列,如sort({KEY:1})。

我将结果导出为json

mongoexport --authenticationDatabase YOURAUTHDB  -u xxx -p xxx -d YOURDB -c YOURCollection  --type=json  -q '{}' -f var_id,var_name | sed '/"_id":/s/"_id":[^,]*,//' > /home/test.json

后面的sed xxx是为了去掉生成json文件时自带的_id字段。

4 结论

基本达成我的目标了吧,本来想着使用’#‘号分割字段,并使用双引号括起来每个字段。现在看来要读出来以后批量用pandas处理。不过json基本可以保证数据不会因为字符错位。