mongo索引批量在postgres里面重建

一些etl工具从mongo同步到pg库里面的数据,多数能处理这种异构的索引,我自己找了一种不那么复杂的方法:

(1)写一个js,在mongo导出源库所有索引信息:

 1 root@ip-10-10-30-211:~# cat mongo_idx.js 
 2 var collectionList = db.getCollectionNames();
 3 for(var index in collectionList){
 4     var collection = collectionList[index];
 5     var cur = db.getCollection(collection).getIndexes();
 6     if(cur.length == 1){
 7         continue;
 8     }
 9     for(var index1 in cur){
10     var next = cur[index1];
11     if(next["key"]["_id"] == '1'){
12         continue;
13     }
14     print("(\""+collection+"\")" +","+JSON.stringify(next.key))}}

然后导出的显示格式为:

#mongo mongo-xxxx-pri.xxxx.space:3717/databasename -usyncuser -pxxxx mongo_idx.js > monidx.json
#cat monidx.json (
"mg_result_all"),{"login":1,"brokerid":1,"usertype":1} ("mg_result_all"),{"publishfrozentime":1,"usertype":1,"accountstatus":1,"accounttype":1,"equity":1,"period_trade":1} ("mg_result_all"),{"rate_ss_profit_balance_close":-1} ("mg_result_brsymday"),{"login":1,"brokerid":1} ("mg_result_brsymday"),{"login":1,"brokerid":1,"close_date":1} ("mg_result_day"),{"login":1,"brokerid":1,"close_date":1} ("mg_result_follall"),{"login":1,"brokerid":1} ("mg_result_follall"),{"masteraccount":1,"masterbrokerid":1} ("mg_result_follall"),{"login":1,"brokerid":1,"usertype":1,"masteraccount":1,"masterbrokerid":1,"masterusertype":1} ("mg_result_follall"),{"masteraccount":1,"masterbrokerid":1,"close_weekofyear":1} ("mg_result_follday"),{"login":1,"brokerid":1,"usertype":1,"masteraccount":1,"masterbrokerid":1,"masterusertype":1} ("mg_result_follday"),{"login":1,"brokerid":1,"close_date":1} ("mg_result_follday"),{"masteraccount":1,"masterbrokerid":1,"close_date":1} ("mg_result_follday"),{"login":1,"brokerid":1,"masteraccount":1,"masterbrokerid":1,"close_date":1} ("mg_result_follday"),{"login":1,"brokerid":1,"masteraccount":1,"masterbrokerid":1,"close_weekofyear":1} ("mg_result_follweekofyear"),{"login":1,"brokerid":1,"standardsymbol":1,"close_weekofyear":1} ("mg_result_hour"),{"login":1,"brokerid":1} ("mg_result_month"),{"login":1,"brokerid":1,"close_month":1} ("mg_result_nusymall"),{"standardsymbol":1} ("mg_result_order"),{"login":1,"brokerid":1,"ticket":1} ("mg_result_sorted_all"),{"statName":1,"updatets":1} ("mg_result_sorted_follweekofyear"),{"statName":1,"updatets":1,"close_weekofyear":1} ("mg_result_sorted_follweekofyear"),{"statName":1,"updatets":1,"close_weekofyear":1,"login":1,"brokerid":1} ("mg_result_sorted_weekofyear"),{"statName":1,"updatets":1,"close_weekofyear":1} ("mg_result_sorted_weekofyear"),{"statName":1,"updatets":1,"close_weekofyear":1,"login":1,"brokerid":1} ("mg_result_symall"),{"login":1,"brokerid":1,"standardsymbol":1} ("mg_result_symall"),{"login":1,"brokerid":1,"money_profit_close_max":1} ("mg_result_symday"),{"login":1,"brokerid":1,"close_date":1} ("mg_result_symday"),{"login":1,"brokerid":1,"standardsymbol":1,"close_date":1} ("mg_result_symmonth"),{"login":1,"brokerid":1,"standardsymbol":1} ("mg_result_symmonth"),{"login":1,"brokerid":1,"standardsymbol":1,"close_month":1} ("mg_result_symweekofyear"),{"login":1,"brokerid":1,"standardsymbol":1,"close_weekofyear":1} ("mg_result_week"),{"login":1,"brokerid":1} ("mg_result_weekofyear"),{"login":1,"brokerid":1}

(2)把这个文件导入postgres数据库存为一个字段,然后写一个sql,生成postggres语法的创建索引语句:

1 select  concat('create index idx_', split_part(translate(idx_name,'(){}:-1"',''),',',1),'_',floor(random()*(25-10)+10),' on ',split_part(translate(idx_name,'(){}:-1"',''),',',1)
2     ,'(',ltrim(SUBSTRING(translate(idx_name,'(){}:-1',''),strpos(translate(idx_name,'(){}:-1',''),','),500),','),
3           ')',';') from  devops.mongo_index_ddl;

生成的创建索引为:

1 create index idx_mg_result_all_12 on mg_result_all(""publishfrozentime"",""usertype"",""accountstatus"",""accounttype"",""equity"",""period_trade"");
2 create index idx_mg_result_all_23 on mg_result_all(""rate_ss_profit_balance_close"");
3 create index idx_mg_result_brsymday_21 on mg_result_brsymday(""login"",""brokerid"");
4 create index idx_mg_result_brsymday_12 on mg_result_brsymday(""login"",""brokerid"",""close_date"");
5 create index idx_mg_result_day_11 on mg_result_day(""login"",""brokerid"",""close_date"");"
6 create index idx_mg_result_follall_12 on mg_result_follall(""login"",""brokerid"");
7 create index idx_mg_result_follall_17 on mg_result_follall(""masteraccount"",""masterbrokerid"");
8 create index idx_mg_result_follall_13 on mg_result_follall(""login"",""brokerid"",""usertype"",""masteraccount"",""masterbrokerid"",""masterusertype"");
....

最后,如果有需要可以做成脚本,只执行一次就好。

posted @ 2020-08-12 20:44  5sdba  阅读(162)  评论(0编辑  收藏  举报