迁移MongoDB的Collections和Index

需求

如题,只想迁移CollectionsIndex,不想迁移数据。

MongoDB官方提供了mongodump工具。数据量小的情况下可以全部备份,然后手动删除bson,数据量大的前提下,可能存在效率问题。

思路

mongodump工具不能单独导出CollectionsIndex,但是工具提供了一个-q的参数,导出查询条件的数据,只要让这个条件为false,就可以满足当前需求。但是使用这个参数必须要指定Collections

因此,第一步获取指定数据库的Collections;第二步,备份Collections;

方案

准备

安装 mongosh - MongoDB Shell
mongodump 示例 - MongoDB 数据库工具

步骤

  1. 使用mongosh配置JS脚本获取指定数据库的Collections,输出到本地临时文件
  2. 读取本地的collections临时文件,使用mongodump备份所有Collections

脚本

get_collections.js

js 复制代码
// MongoDB shell script to get collection names

var dbName = process.argv[15];
var outputFilePath = process.argv[16];

print(dbName+"->"+outputFilePath)

var target = db.getSiblingDB(dbName);
var collections = target.getCollectionNames();

printjson(collections);

// Save the collections to a file
print("Collections have been written to '" + outputFilePath + "'.");
//printjson(collections).save(outputFilePath);
var ret = "";
collections.forEach(col => ret+=col+"\n" )

fs.writeFileSync(outputFilePath,ret)

back-collections.sh,配置mongo的链接信息

bash 复制代码
#!/bin/bash
HOST=""
PORT="27017"
USER_NAME=""
PASS_WORD=""

# 检查参数数量
if [ "$#" -ne 3 ]; then
    echo "Usage: $0 <database_name> <collections_file> <bak_path>"
    exit 1
fi

# 参数
DATABASE_NAME="$1"
OUTPUT_FILE="$2"

# 检查mongo命令是否存在
if ! command -v mongosh &> /dev/null; then
    echo "mongo command not found. Please make sure MongoDB is installed and in your PATH."
    exit 1
fi

# 获取数据库中的集合列表
echo "Getting collections for database '$DATABASE_NAME'..."

# 使用mongo命令执行shell脚本
mongosh --host $HOST --port $PORT --username $USER_NAME --password $PASS_WORD --authenticationDatabase admin --eval "load('$PWD/get_collections.js')" -- "$DATABASE_NAME" "$OUTPUT_FILE"

# 输出结果
echo "Collections have been written to '$OUTPUT_FILE'."

filename=$OUTPUT_FILE

# 检查文件是否存在
if [ ! -f "$filename" ]; then
    echo "File not found: $filename"
    exit 1
fi

# 逐行读取文件内容
while IFS= read -r collection_name; do
    # 执行mongodump命令
    mongodump \
        -u $USER_NAME \
        -p $PASS_WORD \
        -h $HOST \
        --port $PORT \
        -d $1 \
        -c "$collection_name" \
        -q '{"a":{"$exists":true}}' \
        --authenticationDatabase=admin \
        -o ./$3
done < "$filename"

使用方法

  1. get_collection.jsback-collections.sh放到同一目录下
  2. 修改back-collections.sh,添加mongo链接信息
  3. ./back-collections.sh <数据库名> <本地临时文件名> <备份路径>

还原

既然是迁移,备份了就要还原,还原就比较简单了,使用mongodump就可以了

例: mongorestore --uri="mongodb://username:password@10.26.18.17:27017,10.26.18.4:27017/sjl?replicaSet=cmgo-qrmlhglh_0&authSource=admin" ./mongo_bak/stlbill/

相关推荐
彩票管理中心秘书长7 分钟前
MySQL数据库新建流程和字符集详细介绍
后端
geovindu9 分钟前
go: Proxy Pattern
开发语言·后端·设计模式·golang·代理模式
彩票管理中心秘书长11 分钟前
MySQL 用户与权限管理 (DCL) 操作命令大全
后端
彩票管理中心秘书长16 分钟前
MySQL 索引、事务与约束操作命令大全
后端
Rust语言中文社区17 分钟前
【Rust日报】2026-04-24 Vizia 0.4 发布——纯 Rust 声明式响应式 GUI 框架
开发语言·后端·rust
Lisonseekpan29 分钟前
Git:如何将一个分支的特定提交合并到另一个分支?
java·大数据·git·后端·elasticsearch
程序员Better1 小时前
前端成功转型AI全栈,我踩过的坑都替你填上了
前端·后端·ai编程
兔子零10241 小时前
GPT-5.5 与 DeepSeek-V4:大模型竞争的本质,正在从“谁更强”变成“谁让成本更低”
前端·javascript·后端
楼田莉子3 小时前
CMake学习:CMake语法
c++·后端·学习·软件构建