如何将MongoDB中10个结构相同的集合合并为单个集合?
MongoDB多集合合并可行方案
方案1:Mongo Shell 在线聚合合并(适合中小数据量,操作最简单)
直接在Mongo Shell中运行以下脚本即可完成合并,无需导出导入文件:
// 填写你的实际数据库名,如果已经use切换到对应库可忽略本行 use 你的数据库名称; // 遍历10个拆分的user集合 for (let i = 1; i <= 10; i++) { // 补零生成集合名,例如1转为"01",匹配user_01的命名规则 const sourceCol = `user_${String(i).padStart(2, '0')}`; // 聚合写入目标集合 db[sourceCol].aggregate([ { $merge: { into: "user", // 合并的目标集合 on: "_id", // 以_id作为唯一键判断冲突 whenMatched: "keepExisting", // 出现_id重复时保留目标集合已有数据,可按需改为replace覆盖 whenNotMatched: "insert" // 无冲突直接插入新数据 } } ]) }
如果你的数据量很小,也可以用更简单的insertMany实现:
use 你的数据库名称; for (let i = 1; i <= 10; i++) { const sourceCol = `user_${String(i).padStart(2, '0')}`; db.user.insertMany(db[sourceCol].find().toArray()); }
方案2:mongodump+mongorestore 离线合并(适合TB级大数据量,对线上业务影响小)
如果数据量过大,在线合并会占用大量集群资源,可采用先导出再导入的离线方式:
- 第一步:批量导出10个源集合的数据
# 注意替换<数据库名>为实际库名,有认证需求请自行添加-u、-p等认证参数 for num in {01..10}; do mongodump -d <数据库名> -c user_${num} -o ./mongo_user_dump done
- 第二步:将所有导出的数据批量恢复到目标
user集合
for num in {01..10}; do mongorestore -d <数据库名> -c user ./mongo_user_dump/<数据库名>/user_${num}.bson done
合并校验步骤
合并完成后可以执行以下语句校验数据是否完整:
use 你的数据库名称; // 统计所有源集合总条数 let sourceTotal = 0; for (let i = 1; i <=10; i++) { sourceTotal += db[`user_${String(i).padStart(2,'0')}`].countDocuments(); } // 统计目标集合条数 let targetTotal = db.user.countDocuments(); print(`源数据总条数:${sourceTotal},合并后总条数:${targetTotal}`);
两者数值一致则说明合并过程无数据丢失。
内容的提问来源于stack exchange,提问作者cauchuyennhocuatoi
相关产品推荐
相关产品推荐

