需求
- 将mysql中的数据导入到mongodb
- mysql中要将几条相似数据导入成一条记录
思路
- 从mysql导出数据到tvs
- 其中使用group将相似记录分组到一条记录, 并使用group_concat将相似记录的字段拼接为json
- 导入数据到mongodb, 设置相应的格式
- 其中自己组的json不能自动被mongodb识别, 只能暂时以字符串的形式保存, 以往日后能够解决
需要注意的点
- group_concat存在长度限制,默认最大长度为1024
参考
解决方案 SET global group_concat_max_len=15000;
或者 SET session group_concat_max_len=15000;
- 一开始使用cvs格式,但是csv使用逗号分隔,tsv使用tab分隔,这里自己组了json,所以需要导出到tsv格式
- mysql select空字段会是null,需要写一个默认值占位,这里使用了
ifnull(update_date, cast('2019-01-01 00:00:00' as datetime))
, 用法参考mysql的ifnull函数. - mongodb导入时设计类型以供mongdb识别, 命令为
--columnsHaveTypes
, 具体参考 mongoimport官方文档
第一步: 从MySQL导出数据
连接mysql
mysql -h 10.1.65.12 -uroot -p
进入数据库
use ci_bem_d_question_taizhou
取数据的命令
select question_id,concat('{',
group_concat("\"",unique_key,"\"",':',"\"",content,"\"" separator ',')
, '}')
,patient_id,task_id,version,delete_flag,create_date,ifnull(update_date, cast('2019-01-01 00:00:00' as datetime))
from qs_answer
group by patient_id, task_id, question_id
limit 5
into outfile '/tmp/mapline.tsv' fields terminated by '\t'optionally enclosed by ''lines terminated by '\n';
第二步: 导入到MongoDB
mongoimport --drop -d question_taizhou -c qs_answer --type tsv --columnsHaveTypes --fields "question_id.int64(),value.string(),patient_id.int64(),task_id.int64(),version.int32(),delete_flag.int32(),create_date.date(2006-01-02 15:04:05),update_date.date(2006-01-02 15:04:05)" --file 'mapline.tsv'