【mongoDB】mongoDB导出所有库表为json文件

写一个shell脚本,导出所有库的所有表为json文件, 对应库的表导出到对应目录

mongo --host  127.0.0.1:27017 -u username  -p  'XXX'  --authenticationDatabase  admin

结合你提供的 MongoDB 登录信息,为你编写了一个完整的 Shell 脚本。
该脚本会自动获取所有数据库(排除系统自带库),遍历每个库下的所有集合(表),并使用 mongoexport 工具将数据导出为 JSON 文件,文件会按照 数据库名/集合名.json 的结构存放在你指定的目录中。

#!/bin/bash

# ================= 配置区域 =================
# MongoDB 连接配置(基于你提供的命令)
MONGO_HOST="127.0.0.1"
MONGO_PORT="27017"
MONGO_USER="username"
MONGO_PWD='XXX' 
AUTH_DB="admin"

# 导出工具路径(根据你提供的 mongo 路径自动推算 mongoexport 路径)
MONGO_BIN="/path/to/mongo/bin"
MONGO_EXPORT="${MONGO_BIN}/mongoexport"

# 导出文件的根目录(请确保该目录存在,或有权限创建)
EXPORT_ROOT_DIR="/data/mongo/backup_json"
# ===========================================

# 创建导出根目录
mkdir -p "${EXPORT_ROOT_DIR}"

echo "开始连接 MongoDB 并获取数据库列表..."

# 1. 获取所有数据库名称(排除系统自带的库)
# 使用 --quiet 参数只输出结果,不输出连接日志
DATABASES=$(${MONGO_BIN}/mongo --host ${MONGO_HOST}:${MONGO_PORT} -u ${MONGO_USER} -p ${MONGO_PWD} --authenticationDatabase ${AUTH_DB} --quiet --eval "db.getMongo().getDBNames().join('\n')" | grep -vE "admin|local|config")

# 2. 遍历每一个数据库
for DB_NAME in $DATABASES; do
    echo "正在处理数据库: [${DB_NAME}]"
    
    # 创建对应数据库的文件夹
    DB_DIR="${EXPORT_ROOT_DIR}/${DB_NAME}"
    mkdir -p "${DB_DIR}"
    
    # 3. 获取当前数据库下的所有集合(表)名称
    COLLECTIONS=$(${MONGO_BIN}/mongo --host ${MONGO_HOST}:${MONGO_PORT} -u ${MONGO_USER} -p ${MONGO_PWD} --authenticationDatabase ${AUTH_DB} --quiet --eval "db.getSiblingDB('${DB_NAME}').getCollectionNames().join('\n')")
    
    # 4. 遍历每一个集合并执行导出
    for COLL_NAME in $COLLECTIONS; do
        echo "  -> 正在导出集合: [${COLL_NAME}] ..."
        
        # 执行导出命令
        # --jsonArray 参数会将导出的内容包装成一个标准的 JSON 数组,方便后续程序读取
        ${MONGO_EXPORT} \
            --host ${MONGO_HOST} \
            --port ${MONGO_PORT} \
            -u ${MONGO_USER} \
            -p "${MONGO_PWD}" \
            --authenticationDatabase ${AUTH_DB} \
            --db ${DB_NAME} \
            --collection ${COLL_NAME} \
            --type json \
            --out "${DB_DIR}/${COLL_NAME}.json"
            
        if [ $? -eq 0 ]; then
            echo "  -> [成功] ${DB_NAME}.${COLL_NAME} 导出完成!"
        else
            echo "  -> [失败] ${DB_NAME}.${COLL_NAME} 导出出错,请检查日志!"
        fi
    done
done

echo  "所有数据库导出任务已全部完成!"
echo  "文件保存在: ${EXPORT_ROOT_DIR}"

️ 注意事项:

  • 密码特殊字符:你的密码 XXX 如果包含特殊字符(如 @, !, $ 等),在 Shell 脚本中最好用单引号 ' ' 包裹起来,防止被系统错误解析。
  • 权限问题:确保执行该脚本的系统用户,对导出目录(/data/mongo/backup_json)拥有写入权限。
  • 磁盘空间:导出全库 JSON 可能会占用较大磁盘空间,请提前确认服务器有足够的存储空间。
  • 工具路径:脚本中默认 mongoexport 与你的 mongo 命令在同一目录(/path/to/mongo/bin/)下。如果提示找不到 mongoexport,请检查该路径下是否存在此文件。

mongoexport --type json 导出数据时,加不加 --jsonArray 的区别是什么?

mongoexport 加上 --jsonArray 和不加的主要区别在于导出的 JSON 文件结构

  1. 不加 --jsonArray (默认行为)

    • 结构: 每一行(record)是一个独立的、完整的 JSON 对象(document)。
    • 特点: 这种格式被称为 JSON LinesNewline Delimited JSON (NDJSON)。每一行都是一个有效的 JSON,互不干扰。
    • 优点:
      • 文件体积相对较小(没有外层的大数组结构)。
      • 适合流式处理,可以逐行读取,内存效率高,即使文件很大也不容易卡顿。
      • 适用于 mongoimport 默认的导入模式(不需要 --jsonArray)。
    • 缺点:
      • 不是标准的 JSON 数组格式,某些需要完整 JSON 数组的工具或库可能无法直接识别。
    • 示例:
      {"_id": {"$oid": "xxx"}, "name": "Alice", "age": 30}
      {"_id": {"$oid": "yyy"}, "name": "Bob", "age": 25}
      {"_id": {"$oid": "zzz"}, "name": "Charlie", "age": 35}
      
  2. 加上 --jsonArray

    • 结构: 将所有导出的文档放入一个外层的 JSON 数组 [] 内。
    • 特点: 这是标准的 JSON 数组格式。
    • 优点:
      • 符合标准的 JSON 数组规范,可以用标准的 JSON 解析器加载,兼容性好。
      • 对于需要一次性加载所有数据到内存或进行数组操作的场景更方便。
    • 缺点:
      • 文件体积稍大(增加了开头的 [ 和结尾的 ],以及中间的逗号分隔符)。
      • 文件较大时,加载到内存可能会比较吃力,因为需要一次性加载整个数组。
      • 使用 mongoimport 导入时,必须加上 --jsonArray 参数。
    • 示例:
      [
      {"_id": {"$oid": "xxx"}, "name": "Alice", "age": 30},
      {"_id": {"$oid": "yyy"}, "name": "Bob", "age": 25},
      {"_id": {"$oid": "zzz"}, "name": "Charlie", "age": 35}
      ]
      

总结与建议

场景 推荐选项 原因
通用导出 & 后续用 mongoimport 恢复 不加 --jsonArray 文件更紧凑,mongoimport 默认能识别,无需额外参数。
需要标准 JSON 数组格式供其他程序处理 --jsonArray 输出是标准的 JSON 数组,易于解析。
导出大量数据 不加 --jsonArray 逐行格式更适合大数据量的流式读写,内存友好。

因此,对于备份和恢复场景,尤其是使用 MongoDB 自带工具链时,通常不加 --jsonArray 是更常见的选择。只有当你明确需要一个标准 JSON 数组文件时,才加上它。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容