前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何快速批量导出MongoDB结构

如何快速批量导出MongoDB结构

作者头像
徐靖
发布2022-09-22 11:45:18
1.1K0
发布2022-09-22 11:45:18
举报
文章被收录于专栏:DB说DB说

背景

最近接到这样的需求,需要生产环境所有MongoDB的表结构导入一份到测试环境包括集合的分片信息以及对应索引.我们知道MongoDB是动态模式,每一行对应列可能都不同以及索引信息也没有类似数据字典去记录,需要通过循环每个db以及每个集合去getIndexes()(老版本有类似数据字典可以查询),我们环境中分片以及索引创建都是dba去创建,没有在代码中创建(如果在代码中生成,直接搭建好MongoDB环境启动应用即可自动生成),本次主要针对非代码自动创建的情况如何快递导出MongoDB结构.

分析过程

代码语言:javascript
复制
  手动创建分片集合以及索引步骤:

  1、对db开启分区--没有则跳过
  sh.enableSharding('db','primaryshard');
  2、对集合开启分片--range、hash以及组合--没有则自动跳过

sh.shardCollection('db.collection',{分片字段:1})
3、创建需要的索引--没有自动跳过
db.getSiblingDB('db').collectionname.createIndexes([{a:1},{b:1}])

如果手动创建少量对象还可以,如果需要创建几百个对象上千个,估计这个手工累的够呛.如果此时能够批量生成对应语句,然后在测试环境直接执行,那就可以解放我们的小手了.

【以下是简陋脚本实现以上功能--将生成的脚本直接复制测试环境执行即可】

生成分片db语句

代码语言:javascript
复制
db.getSiblingDB('config').databases.find({"partitioned" : true}).forEach(function(db){
print("sh.enableSharding(" + '"'+db._id + '"'+","+'"'+db.primary+'")');
})
--输出以下结果

sh.enableSharding("xiaoxu1","shard1")
sh.enableSharding("xiaoxu2","shard2")
sh.enableSharding("xiaoxu3","shard3")
sh.enableSharding("xiaoxu4","shard4")
sh.enableSharding("xiaoxu5","shard5")

【不包括primarShard属性】

代码语言:javascript
复制
db.getSiblingDB('config').databases.find({"partitioned" : true}).forEach(function(db){
print("sh.enableSharding(" + '"'+db._id + '")');
})
--输出以下结果

sh.enableSharding("xiaoxu1")
sh.enableSharding("xiaoxu2")
sh.enableSharding("xiaoxu3")
sh.enableSharding("xiaoxu4")
sh.enableSharding("xiaoxu5")

生成表分片语句

代码语言:javascript
复制
db.getSiblingDB('config').collections.find({"dropped":false}).
forEach(function(collection){
print("sh.shardCollection('" + collection._id + "'"+",");
printjson(collection.key);
print(","+collection.unique+");");
})

--输出以下格式

代码语言:javascript
复制
sh.shardCollection('xiaoxu3.expInform',
{ "_id" : "hashed" }
,false);
sh.shardCollection('xiaoxu4.monitor',
{ "org" : 1, "ct" : 1 }
,false);
sh.shardCollection('xiaoxu5.opDeleteIn',
{ "no" : "hashed" }
,false);

列出所有DB下的索引信息,也可以查看特定DB,只需要在find后面指定查询条件即可

代码语言:javascript
复制
db.getSiblingDB("config").databases.find({}).forEach(function(d){
mdb=db.getSiblingDB(d._id);
mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){
currentCollection = mdb.getCollection(c.name);
indexes=currentCollection.getIndexes()
print("db.getSibilingDB("+"'"+mdb+"')."+"runCommand({ ");
print("createIndexes: " + '"' + c.name+ '"' + ",");
print("indexes: ");
printjson(indexes);
print("});");
})
});

--输出以下格式

代码语言:javascript
复制
db.getSibilingDB('xiaoxu3').runCommand({
createIndexes: "expInform",
indexes:
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "_id" : "hashed"
                },
                "name" : "_id_hashed"
        }
]
});

db.getSibilingDB('xiaoxu').runCommand({
createIndexes: "xiaoxu",
indexes:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
});

【总结】

通过以上脚本,我们可以快速把生产环境结构复制一份到测试环境,当需要有大量集合需要复制时,通过脚本可以节约时间同时降低错误率.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档