如何跨部署环境将MongoDB整库(含多集合)批量迁移?
当然可以!不用再手动逐个处理20个集合啦,MongoDB有现成的方法能帮你一次性搞定整个库的导出和导入,我给你分两种情况详细说——一种是满足你要JSON文件的需求,另一种是更高效的原生格式方案:
因为你明确要JSON格式,我们可以通过简单脚本批量遍历所有集合,用mongoexport逐个导出:
先获取students库的所有集合
打开MongoDB Shell,连接到Server 1的实例后执行:use students show collections或者直接用命令行批量获取(适合后续脚本):
mongo --host <Server1的IP或主机名> --port <端口号> --username <用户名> --password <密码> --eval "use students; printjson(db.getCollectionNames())"提示:如果你的MongoDB没有开启认证,可以去掉
--username和--password参数批量导出脚本
根据你的操作系统选择对应的脚本:- Linux/macOS:保存为
export_students.sh,给脚本加执行权限后运行#!/bin/bash DB_NAME="students" OUTPUT_DIR="./students_json_export" MONGO_HOST="<Server1的IP或主机名>" MONGO_PORT="<端口号>" MONGO_USER="<用户名>" MONGO_PASS="<密码>" # 创建存储JSON文件的目录 mkdir -p $OUTPUT_DIR # 获取所有集合名称 COLLECTIONS=$(mongo --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USER --password $MONGO_PASS --eval "use $DB_NAME; printjson(db.getCollectionNames())" | grep -E '"[^"]+"' | tr -d '",[] ') # 循环导出每个集合为JSON for COLLECTION in $COLLECTIONS; do echo "正在导出集合:$COLLECTION..." mongoexport --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USER --password $MONGO_PASS --db $DB_NAME --collection $COLLECTION --out "$OUTPUT_DIR/$COLLECTION.json" done - Windows:保存为
export_students.bat,双击运行@echo off set DB_NAME=students set OUTPUT_DIR=.\students_json_export set MONGO_HOST=<Server1的IP或主机名> set MONGO_PORT=<端口号> set MONGO_USER=<用户名> set MONGO_PASS=<密码> :: 创建存储JSON文件的目录 if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%" :: 获取所有集合名称并逐个导出 for /f "delims=" %%i in ('mongo --host %MONGO_HOST% --port %MONGO_PORT% --username %MONGO_USER% --password %MONGO_PASS% --eval "use %DB_NAME%; printjson(db.getCollectionNames())" ^| findstr /r "\"[^\"]+\""') do ( set "COLLECTION=%%i" set "COLLECTION=!COLLECTION:"=!" echo 正在导出集合:!COLLECTION!... mongoexport --host %MONGO_HOST% --port %MONGO_PORT% --username %MONGO_USER% --password %MONGO_PASS% --db %DB_NAME% --collection !COLLECTION! --out "%OUTPUT_DIR%\!COLLECTION!.json" )
执行后,所有集合的JSON文件会存在
students_json_export文件夹里。- Linux/macOS:保存为
把导出的文件夹复制到远程桌面机器后,同样用脚本批量导入:
Linux/macOS导入脚本:保存为
import_student2.sh,加执行权限后运行#!/bin/bash TARGET_DB="Student2" INPUT_DIR="./students_json_export" MONGO_HOST="<远程桌面的IP或主机名>" MONGO_PORT="<端口号>" MONGO_USER="<用户名>" MONGO_PASS="<密码>" # 循环导入每个JSON文件 for FILE in $INPUT_DIR/*.json; do # 从文件名提取集合名称(去掉.json后缀) COLLECTION=$(basename "$FILE" .json) echo "正在导入集合:$COLLECTION 到 $TARGET_DB..." mongoimport --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USER --password $MONGO_PASS --db $TARGET_DB --collection $COLLECTION --file "$FILE" --jsonArray doneWindows导入脚本:保存为
import_student2.bat,双击运行@echo off set TARGET_DB=Student2 set INPUT_DIR=.\students_json_export set MONGO_HOST="<远程桌面的IP或主机名>" set MONGO_PORT="<端口号>" set MONGO_USER="<用户名>" set MONGO_PASS="<密码>" :: 循环导入每个JSON文件 for %%f in ("%INPUT_DIR%\*.json") do ( set "COLLECTION=%%~nf" echo 正在导入集合:!COLLECTION! 到 %TARGET_DB%... mongoimport --host %MONGO_HOST% --port %MONGO_PORT% --username %MONGO_USER% --password %MONGO_PASS% --db %TARGET_DB% --collection !COLLECTION! --file "%%f" --jsonArray )提示:如果你的JSON文件是每行一个文档(而非数组格式),可以去掉
--jsonArray参数
如果对文件格式没有严格要求,推荐用MongoDB原生的mongodump和mongorestore工具,它们处理BSON格式,速度更快,还能保留索引、权限等元数据,操作更简单:
导出整个students库(在Server 1上执行):
mongodump --host <Server1的IP> --port <端口> --username <用户名> --password <密码> --db students --out ./students_dump导入到Student2库(在远程桌面机器上执行,先把
students_dump文件夹复制过来):mongorestore --host <远程桌面IP> --port <端口> --username <用户名> --password <密码> --db Student2 ./students_dump/students
注意事项
- 操作时确保两端MongoDB服务正常运行,网络连接通畅(远程连接时)。
- 替换脚本中的
<占位符>为你的实际信息,比如IP、端口、用户名等。 - 如果是本地实例且无认证,直接去掉脚本中的
--username和--password参数即可。
内容的提问来源于stack exchange,提问作者Bimlendu Kumar

