业务需求
- 源数据库存储量达到20TB,索引数量上亿条
- 从数据库导出指定数据到目标数据库上,合计约1GB数据
- 需要保持相同的数据库名称和集合名词、数据位置
解决思路
导出数据的_id有一定数字规律,可以使用正则表达式去匹配批量导出,或者遍历命中索引逐个导出,但是正则匹配数字的字符串速度很慢,且需要全数据库匹配,少组数据测试后,对MongoDB调用js脚本逐个命中索引导出最快
处理步骤
一、准备目标数据库
-
在本地安装MongoDB数据库,默认安装即可
-
在磁盘上新建数据库目录,例如“D:\Hying\DBTest”
-
启动目标数据库,显示数据库控制台,查看启动状态
"D:\Program Files\MongoDB\Server\3.2\bin\mongod" --dbpath "D:\Hying\DBTest"
若需要关闭目标数据库,关闭数据库的控制台窗口即可
二、准备导出脚本
与数据库交互的方法属于MongoDB的内置驱动,可查询官方手册使用,遍历和字符串拼接等可使用JavaScript方法
test.js
// 连接对象
var conn_src = new Mongo("192.168.130.1:27017");
var conn_tgt = new Mongo("127.0.0.1:27017");
// 数据库对象
var db_name = "db_test";
var db_src = conn_src.getDB(db_name);
var db_tgt = conn_tgt.getDB(db_name);
// 遍历
for (var i = 0; i < 10086; ++i) {
// 集合对象
var co_name = "collection_" + i / 1000;
var co_src = db_src.getCollection(co_name);
var co_tgt = db_tgt.getCollection(co_name);
// 查找并导出数据
var doc = co_src.findOne({ _id: id + "-" + i });
if (doc) co_tgt.insert(doc);
}
print("finished...");
三、执行脚本
"D:\Program Files\MongoDB\Server\3.2\bin\mongo" "D:\test.js"