迁移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/

相关推荐
胡桃姓胡,蝴蝶也姓胡3 小时前
Rag优化 - 如何提升首字响应速度
后端·大模型·rag
紫荆鱼6 小时前
设计模式-命令模式(Command)
c++·后端·设计模式·命令模式
编码追梦人7 小时前
深耕 Rust:核心技术解析、生态实践与高性能开发指南
开发语言·后端·rust
朝新_7 小时前
【SpringBoot】详解Maven的操作与配置
java·spring boot·笔记·后端·spring·maven·javaee
绝无仅有7 小时前
某教育大厂面试题解析:MySQL索引、Redis缓存、Dubbo负载均衡等
vue.js·后端·面试
sean8 小时前
开发一个自己的 claude code
前端·后端·ai编程
追逐时光者8 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 59 期(2025年10.20-10.26)
后端·.net
盖世英雄酱5813610 小时前
java深度调试【第三章内存分析和堆内存设置】
java·后端
007php00710 小时前
京东面试题解析:同步方法、线程池、Spring、Dubbo、消息队列、Redis等
开发语言·后端·百度·面试·职场和发展·架构·1024程序员节
程序定小飞10 小时前
基于springboot的电影评论网站系统设计与实现
java·spring boot·后端