You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:39:04