【问题标题】:How to export all collections in MongoDB?如何导出 MongoDB 中的所有集合?
【发布时间】:2012-06-30 14:55:21
【问题描述】:

我想通过命令导出MongoDB中的所有集合:

mongoexport -d dbname -o Mongo.json

结果是:
未指定收藏!

手册说,如果你不指定一个集合,所有的集合都会被导出。
但是,为什么这不起作用?

http://docs.mongodb.org/manual/reference/mongoexport/#cmdoption-mongoexport--collection

我的 MongoDB 版本是 2.0.6。

【问题讨论】:

  • 您使用的是哪个版本的 MongoDB? mongoexport 的 wiki 文档表明这是一个用于导出集合的命令行工具。也许导出多个集合的能力是为了更新版本?如果要备份数据库中的所有集合,mongodump 会将所有集合导出到 BSON。
  • 看起来对所有集合使用 mongoexport 的选项是一个尚未计划的计划功能:SERVER-201 .. 所以 mongodump 目前是导出完整数据库的最佳选择。使用 MongoDB client drivers 之一编写相当于 mongoexport 的内容并不难。
  • 您应该将答案标记为已接受。我的投票是stackoverflow.com/a/16605781/1686575
  • 作为记录,MongoDB documentation 声明 避免使用 mongoimport 和 mongoexport 进行完整实例生产备份。它们不能可靠地保留所有丰富的 BSON 数据类型,因为 JSON 只能表示 BSON 支持的类型的子集。使用 MongoDB 备份方法中描述的 mongodump 和 mongorestore 来实现这种功能。 因此,它不仅适用于 Mentor Reka 所说的懒惰的人,而且也是执行此操作的首选方法。

标签: mongodb export


【解决方案1】:

如果您对 bson 格式没问题,那么您可以使用带有相同 -d 标志的 mongodump 实用程序。它会将所有集合以 bson 格式转储到转储目录(默认值,可以通过 -o 选项更改)。然后,您可以使用 mongorestore 实用程序导入这些文件。

【讨论】:

    【解决方案2】:

    我为此编写了 bash 脚本。只需使用 2 个参数(数据库名称、存储文件的目录)运行它。

    #!/bin/bash
    
    if [ ! $1 ]; then
            echo " Example of use: $0 database_name [dir_to_store]"
            exit 1
    fi
    db=$1
    out_dir=$2
    if [ ! $out_dir ]; then
            out_dir="./"
    else
            mkdir -p $out_dir
    fi
    
    tmp_file="fadlfhsdofheinwvw.js"
    echo "print('_ ' + db.getCollectionNames())" > $tmp_file
    cols=`mongo $db $tmp_file | grep '_' | awk '{print $2}' | tr ',' ' '`
    for c in $cols
    do
        mongoexport -d $db -c $c -o "$out_dir/exp_${db}_${c}.json"
    done
    rm $tmp_file
    

    【讨论】:

    • 导入:for file in *.json; do c=${file#*exp_yourdbname_}; c=${c%.json}; mongoimport --db yourdbname --collection "${c}" --file "${file}"; done
    • 我想用批处理脚本导入.csv,你知道吗?
    • 我可以安装什么来使用 mongo 命令?谢了。
    • 通过选择社区版mongodb.com/try/download/community在此处安装mongo javascript CLI
    【解决方案3】:

    您可以使用mongo --eval 'printjson(db.getCollectionNames())' 获取收藏列表 然后对所有这些做一个 mongoexport 。 这是一个红宝石的例子

      out = `mongo  #{DB_HOST}/#{DB_NAME} --eval "printjson(db.getCollectionNames())"`
    
      collections = out.scan(/\".+\"/).map { |s| s.gsub('"', '') }
    
      collections.each do |collection|
        system "mongoexport --db #{DB_NAME}  --collection #{collection}  --host '#{DB_HOST}' --out #{collection}_dump"
      end
    

    【讨论】:

    • 这很好,但您可能希望 out.scan 正则表达式是非贪婪的。 out.scan(/\".+?\"/).map { |s| s.gsub('"', '') }
    • 我可以安装什么来使用 mongo 命令?谢了。
    【解决方案4】:

    我需要 Windows 批处理脚本版本。这个帖子很有用,所以我想我也会为它贡献我的答案。

    mongo "{YOUR SERVER}/{YOUR DATABASE}" --eval "rs.slaveOk();db.getCollectionNames()" --quiet>__collections.txt
    for /f %%a in ('type __collections.txt') do @set COLLECTIONS=%%a
    for %%a in (%COLLECTIONS%) do mongoexport --host {YOUR SERVER} --db {YOUR DATABASE} --collection %%a --out data\%%a.json
    del __collections.txt
    

    我在使用set /p COLLECTIONS=<__collections.txt 时遇到了一些问题,因此使用了复杂的for /f 方法。

    【讨论】:

    • 我可以安装什么来使用 mongo 命令?谢了。
    • 这是很久以前的事了……但它只是 MongoDB shell。 mongodb.com/try/download/shell
    【解决方案5】:

    懒人用mongodump,更快:

    mongodump -d <database_name> -o <directory_backup>
    

    然后“恢复/导入”它(来自 directory_backup/dump/):

    mongorestore -d <database_name> <directory_backup>
    

    这样,您无需单独处理所有集合。只需指定数据库即可。

    请注意,我建议不要将mongodump/mongorestore 用于大数据存储。它非常慢,一旦超过 10/20GB 的数据,可能需要数小时才能恢复。

    【讨论】:

    • 是不是JSON和BSON的兼容性问题?
    • mongodump 2.2 或更高版本使用的数据格式与早期版本的 mongod 不兼容。不要使用最新版本的 mongodump 备份旧数据存储。
    • 我相信还原命令是“mongorestore -b DATABASE ./dump-folder”(其中 ./dump-folder 是路径或您导出的数据)。
    • "mongorestore -d DATABASE ./dump-folder"
    • @LucaSteeb 使用 --excludeCollection=sessions
    【解决方案6】:

    如果您想使用 mongoexportmongoimport 从数据库中导出/导入每个集合,我认为this utility 可以为您提供帮助。 我用过几次类似的工具;

    LOADING=false
    
    usage()
    {
        cat << EOF
        usage: $0 [options] dbname
    
        OPTIONS:
            -h      Show this help.
            -l      Load instead of export
            -u      Mongo username
            -p      Mongo password
            -H      Mongo host string (ex. localhost:27017)
    EOF
    }
    
    while getopts "hlu:p:H:" opt; do
        MAXOPTIND=$OPTIND
    
        case $opt in 
            h)
                usage
                exit
                ;;
            l)
                LOADING=true
                ;;
            u)
                USERNAME="$OPTARG"
                ;;
            p) 
                PASSWORD="$OPTARG"
                ;;
            H)
                HOST="$OPTARG"
                ;;
            \?)
                echo "Invalid option $opt"
                exit 1
                ;;
        esac
    done
    
    shift $(($MAXOPTIND-1))
    
    if [ -z "$1" ]; then
        echo "Usage: export-mongo [opts] <dbname>"
        exit 1
    fi
    
    DB="$1"
    if [ -z "$HOST" ]; then
        CONN="localhost:27017/$DB"
    else
        CONN="$HOST/$DB"
    fi
    
    ARGS=""
    if [ -n "$USERNAME" ]; then
        ARGS="-u $USERNAME"
    fi
    if [ -n "$PASSWORD" ]; then
        ARGS="$ARGS -p $PASSWORD"
    fi
    
    echo "*************************** Mongo Export ************************"
    echo "**** Host:      $HOST"
    echo "**** Database:  $DB"
    echo "**** Username:  $USERNAME"
    echo "**** Password:  $PASSWORD"
    echo "**** Loading:   $LOADING"
    echo "*****************************************************************"
    
    if $LOADING ; then
        echo "Loading into $CONN"
        tar -xzf $DB.tar.gz
        pushd $DB >/dev/null
    
        for path in *.json; do
            collection=${path%.json}
            echo "Loading into $DB/$collection from $path"
            mongoimport $ARGS -d $DB -c $collection $path
        done
    
        popd >/dev/null
        rm -rf $DB
    else
        DATABASE_COLLECTIONS=$(mongo $CONN $ARGS --quiet --eval 'db.getCollectionNames()' | sed 's/,/ /g')
    
        mkdir /tmp/$DB
        pushd /tmp/$DB 2>/dev/null
    
        for collection in $DATABASE_COLLECTIONS; do
            mongoexport --host $HOST -u $USERNAME -p $PASSWORD -db $DB -c $collection --jsonArray -o $collection.json >/dev/null
        done
    
        pushd /tmp 2>/dev/null
        tar -czf "$DB.tar.gz" $DB 2>/dev/null
        popd 2>/dev/null
        popd 2>/dev/null
        mv /tmp/$DB.tar.gz ./ 2>/dev/null
        rm -rf /tmp/$DB 2>/dev/null
    fi
    

    【讨论】:

      【解决方案7】:

      如果需要,您可以将所有集合导出到 csv 而不指定 --fields(将导出所有字段)。

      http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ 运行这个 bash 脚本

      OIFS=$IFS;
      IFS=",";
      
      # fill in your details here
      dbname=DBNAME
      user=USERNAME
      pass=PASSWORD
      host=HOSTNAME:PORT
      
      # first get all collections in the database
      collections=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();db.getCollectionNames();"`;
      collections=`mongo $dbname --eval "rs.slaveOk();db.getCollectionNames();"`;
      collectionArray=($collections);
      
      # for each collection
      for ((i=0; i<${#collectionArray[@]}; ++i));
      do
          echo 'exporting collection' ${collectionArray[$i]}
          # get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
          keys=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();var keys = []; for(var key in db.${collectionArray[$i]}.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
          # now use mongoexport with the set of keys to export the collection to csv
          mongoexport --host $host -u $user -p $pass -d $dbname -c ${collectionArray[$i]} --fields "$keys" --csv --out $dbname.${collectionArray[$i]}.csv;
      done
      
      IFS=$OIFS;
      

      【讨论】:

        【解决方案8】:

        在尝试了很多复杂的示例后,我发现非常简单的方法对我有用。

        我只是想从本地转储一个数据库并将其导入远程实例:

        在本地机器上:

        mongodump -d databasename
        

        然后我 scp'd 我的转储到我的服务器机器:

        scp -r dump user@xx.xxx.xxx.xxx:~
        

        然后简单地从转储的父目录:

        mongorestore 
        

        然后导入数据库。

        当然假设 mongodb 服务正在运行。

        【讨论】:

          【解决方案9】:

          如果您想备份服务器上的所有数据库,而不必担心数据库被调用,请使用以下 shell 脚本:

          #!/bin/sh
          
          md=`which mongodump`
          pidof=`which pidof`
          mdi=`$pidof mongod`
          dir='/var/backup/mongo'
          
          if [ ! -z "$mdi" ]
             then
                  if [ ! -d "$dir" ]
                     then
                         mkdir -p $dir
                     fi
                  $md --out $dir >/dev/null 2>&1
             fi
          

          这使用 mongodump 实用程序,如果未指定,它将备份所有 DB。

          你可以把它放在你的 cronjob 中,它只会在 mongod 进程正在运行时运行。如果不存在,它也会创建备份目录。

          每个数据库备份都写入一个单独的目录,因此您可以从全局转储中恢复单个数据库。

          【讨论】:

            【解决方案10】:
            1. 打开连接
            2. 启动服务器
            3. 打开新的命令提示符

            导出:

            mongo/bin&gt; mongoexport -d webmitta -c domain -o domain-k.json

            进口:

            mongoimport -d dbname -c newCollecionname --file domain-k.json

            在哪里

            webmitta(db name)
            domain(Collection Name)
            domain-k.json(output file name)
            

            【讨论】:

            • 这是 mongoexport 用于导出
            • 问题是关于导出所有集合。
            【解决方案11】:

            如果您想转储所有数据库中的所有集合(这是对原始提问者意图的广泛解释),请使用

            mongodump
            

            所有数据库和集合都将在“当前”位置的一个名为“dump”的目录中创建

            【讨论】:

            • 最佳且不复杂的方法!!
            【解决方案12】:

            请告诉我们您在哪里安装了 Mongo DB? (在 Ubuntu 或 Windows 中)

            • 对于 Windows:
            1. 在导出之前,您必须在 cmd 提示符下连接到 Mongo DB,并确保您能够连接到本地主机。

            2. 现在打开一个新的 cmd 提示符并执行以下命令,

              mongodump --db database name --out path to save  
              

              例如:mongodump --db mydb --out c:\TEMP\op.json

            3. 访问https://www.youtube.com/watch?v=hOCp3Jv6yKo了解更多详情。

            • 对于 Ubuntu:
            1. 登录到您安装了 Mongo DB 的终端,并确保您能够连接到您的 Mongo DB。

            2. 现在打开一个新终端并执行以下命令,

              mongodump -d database name -o file name to save  
              

              例如:mongodump -d mydb -o output.json

            3. 访问https://www.youtube.com/watch?v=5Fwd2ZB86gg了解更多详情。

            【讨论】:

              【解决方案13】:

              如果你想连接像 mongolab.com 这样的远程 mongoDB 服务器,你应该传递连接凭据 例如。

              mongoexport -h id.mongolab.com:60599 -u username -p password -d mydb -c mycollection -o mybackup.json
              

              【讨论】:

              • 这个解决方案是最好的,因为它正确地回答了原始问题。
              • 请注意,这并不能可靠地保留所有丰富的 BSON 数据类型,因为 JSON 只能表示 BSON 支持的类型的子集。使用 MongoDB Backup Methods 中描述的 mongodump 和 mongorestore 来实现这种功能。 (docs)
              【解决方案14】:

              导出所有集合:

              mongodump -d database_name -o directory_to_store_dumps
              

              要恢复它们:

              mongorestore -d database_name directory_backup_where_mongodb_tobe_restored
              

              【讨论】:

              • 我做了mongodump -d mongo -o path\to\Desktop\blog,我从 CMD 得到了一个SyntaxError: missing ; before statement。 :(
              【解决方案15】:

              以下是在恢复导出的数据库时对我有用的方法:

              mongorestore -d 0 ./0 --drop

              其中 ./ 包含导出的 bson 文件。请注意,--drop 将覆盖现有数据。

              【讨论】:

                【解决方案16】:

                我意识到这是一个相当古老的问题,如果您想要 100% 忠实的结果(包括索引),那么 mongodump/mongorestore 显然是正确的方法。

                但是,我需要一个快速而肮脏的解决方案,它可能在新旧版本的 MongoDB 之间向前和向后兼容,前提是没有什么特别古怪的事情发生。为此,我想要原始问题的答案。

                上面还有其他可以接受的解决方案,但是这个 Unix 管道相对较短且很贴心:

                mongo --quiet mydatabase --eval "db.getCollectionNames().join('\n')" | \
                grep -v system.indexes | \
                xargs -L 1 -I {} mongoexport -d mydatabase -c {} --out {}.json
                

                这将为每个集合生成一个适当命名的.json 文件。

                请注意,数据库名称(“mydatabase”)出现了两次。我假设数据库是本地的,您不需要传递凭据,但使用 mongomongoexport 很容易做到这一点。

                请注意,我使用 grep -v 来丢弃 system.indexes,因为我不希望旧版本的 MongoDB 尝试从新版本解释系统集合。相反,我允许我的应用程序进行其通常的 ensureIndex 调用以重新创建索引。

                【讨论】:

                • 感谢您准确回答所提出的问题,这对我很有帮助!
                • 答案对于这个问题来说已经足够合适了。此命令的用例仅适用于开发迁移。由于 JSON 或 CSV 无法处理 BSON 可以处理的所有数据格式,而 mongodump/mongorestore 工具可以。可以改进为也有 mongoimport 语句。我用它来将数据从 mongo v4.2 迁移到 v4.0。与你在上一段中所说的一致
                【解决方案17】:

                以前的答案解释得很好,我添加我的答案以帮助您处理远程密码保护数据库

                mongodump --host xx.xxx.xx.xx --port 27017 --db your_db_name --username your_user_name --password your_password --out /target/folder/path
                

                【讨论】:

                • 这也同样有效:mongodump --uri="mongodb://YOUR_USER_ID:YOUR_PASSWORD@YOUR_HOST_IP/YOUR_DB_NAME" --out /target/folder/path
                • --authenticationDatabase admin 需要时
                【解决方案18】:

                您可以使用以下命令创建 zip 文件。它将创建提供的数据库 {dbname} 的 zip 文件。稍后您可以将以下 zip 文件导入 mongo DB。

                Window filepath=C:\Users\Username\mongo 
                
                mongodump --archive={filepath}\+{filename}.gz --gzip --db {dbname}
                

                【讨论】:

                【解决方案19】:

                按照以下步骤从服务器创建一个 mongodump 并将其导入另一台具有用户名和密码的服务器/本地计算机

                1. mongodump -d dbname -o dumpname -u username -p password
                2. scp -r user@remote:~/location/of/dumpname ./
                3. mongorestore -d dbname dumpname/dbname/ -u username -p password
                

                【讨论】:

                  【解决方案20】:
                  #mongodump using sh script 
                  #!/bin/bash
                  TIMESTAMP=`date +%F-%H%M`
                  APP_NAME="folder_name"
                  BACKUPS_DIR="/xxxx/tst_file_bcup/$APP_NAME"
                  BACKUP_NAME="$APP_NAME-$TIMESTAMP"
                  /usr/bin/mongodump -h 127.0.0.1 -d <dbname> -o $BACKUPS_DIR/$APP_NAME/$BACKUP_NAME
                  tar -zcvf $BACKUPS_DIR/$BACKUP_NAME.tgz $BACKUPS_DIR/$APP_NAME/$BACKUP_NAME
                  rm -rf /home/wowza_analytics_bcup/wowza_analytics/wowza_analytics
                  ### 7 days old backup delete automaticaly using given command
                  
                  find /home/wowza_analytics_bcup/wowza_analytics/ -mindepth 1 -mtime +7 -delete
                  

                  【讨论】:

                    【解决方案21】:

                    首先,启动 Mongo DB - 为此转到路径 ->

                    C:\Program Files\MongoDB\Server\3.2\bin并点击mongod.exe文件启动MongoDB服务器。

                    Windows 中要导出的命令

                    • 使用内部 IP 地址和端口从远程服务器将 Windows 中的 MongoDB 数据库从“远程服务器”导出到目录 C:/Users/Desktop/temp-folder 中的本地计算机的命令。
                    C:\> mongodump --host remote_ip_address:27017 --db <db-name> -o C:/Users/Desktop/temp-folder
                    

                    Windows 中要导入的命令

                    • 从本地机器目录C:/Users/Desktop/temp-folder/db-dir将Windows中的MongoDB数据库导入“远程服务器”的命令
                    C:\> mongorestore --host=ip --port=27017 -d <db-name> C:/Users/Desktop/temp-folder/db-dir
                    

                    【讨论】:

                      【解决方案22】:

                      有多种选择,具体取决于您想要做什么

                      1) 如果要将数据库导出到另一个 mongo 数据库,则应使用mongodump。这会创建一个 BSON 文件文件夹,其中包含 JSON 所没有的元数据。

                      mongodump
                      mongorestore --host mongodb1.example.net --port 37017 dump/
                      

                      2) 如果您想将数据库导出为 JSON,可以使用mongoexport,除非您必须一次收集一个(这是设计使然)。不过我认为用mongodump 导出整个数据库然后转换为JSON 是最简单的。

                      # -d is a valid option for both mongorestore and mongodump
                      
                      mongodump -d <DATABASE_NAME>
                      for file in dump/*/*.bson; do bsondump $file > $file.json; done
                      

                      【讨论】:

                        【解决方案23】:

                        对于转储,您的数据库使用以下 CMD

                           mongodump -d <your d name> -o <dump path>
                        Ex:mongodump -d qualetics -o D:\dbpackup\qualetics
                        

                        【讨论】:

                          【解决方案24】:

                          您可以使用 mongodump 命令完成此操作

                          第 1 步:打开命令提示符

                          第 2 步:转到 mongoDB 安装的 bin 文件夹(C:\Program Files\MongoDB\Server\4.0\bin)

                          第三步:然后执行以下命令

                          mongodump -d your_db_name -o destination_path

                          your_db_name = 测试

                          destination_path = C:\Users\HP\Desktop

                          导出的文件将在destination_path\your_db_name 文件夹中创建(在本例中为C:\Users\HP\Desktop\test)

                          参考:o7planning

                          【讨论】:

                            【解决方案25】:

                            即使在 mongo 版本 4 中,也无法一次导出所有集合。从运行在 27017 端口的本地 MongoDB 实例将指定的集合导出到指定的输出文件,您可以使用以下命令:

                            .\mongoexport.exe --db=xstaging --collection=products --out=c:/xstaging.products.json

                            【讨论】:

                              【解决方案26】:

                              我将所有收藏转储到 robo3t。 我在 vagrant/homestead 上运行以下命令。这对我有用

                              mongodump --host localhost --port 27017 --db db_name --out db_path
                              

                              【讨论】:

                              • 这行得通。而且命令行很简单。
                              【解决方案27】:

                              如果您正在处理远程数据库,您可以尝试这些命令,因为您不介意输出是 BSON

                              1。转储为 gzip 存档

                              mongodump --uri="mongodb://YOUR_USER_ID:YOUR_PASSWORD@YOUR_HOST_IP/YOUR_DB_NAME" --gzip --archive > YOUR_FILE_NAME
                              

                              2。恢复 (Copy a database from one to another)

                              mongorestore --uri="mongodb://$targetUser:$targetPwd@$targetHost/$targetDb" --nsFrom="$sourceDb.*" --nsTo="$targetDb.*" --gzip --archive
                              

                              【讨论】:

                                【解决方案28】:

                                如果您遇到此问题: Failed: can't create session: could not connect to server: connection() : auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.

                                然后添加--authenticationDatabase admin

                                例如:

                                mongodump -h 192.168.20.30:27018 --authenticationDatabase admin -u dbAdmin -p dbPassword -d dbName -o path/to/folder

                                【讨论】:

                                  【解决方案29】:

                                  现在不推荐使用某些选项,在 4.4.5 版本中,这是我的做法

                                  mongodump --archive="my-local-db" --db=my
                                  
                                  
                                  mongorestore --archive="my-local-db" --nsFrom='my.*' --nsTo='mynew.*'
                                  

                                  在此处阅读有关恢复的更多信息:https://docs.mongodb.com/database-tools/mongorestore/

                                  【讨论】:

                                    【解决方案30】:

                                    这是我用来实现结果的 bash 脚本。该脚本被概括为 4 个输入(主机 url、数据库、用户名和密码),因此可以在任何 mongo 数据库上使用。

                                    dburl=$1
                                    username=$3
                                    password=$4
                                    db=$2
                                    
                                    mongoAccess=mongodb+srv://$username:$password@$dburl/$db
                                    
                                    Collections=$(mongo $mongoAccess --quiet --eval "db.getCollectionNames()" | sed 's/,/ /g' | tail +6)
                                    
                                    #echo $Collections
                                    
                                    for col in $Collections
                                    do
                                        if [ "$col" = "[" ] || [ "$col" = "]" ]
                                        then
                                            continue
                                        else
                                            echo "Exporting $col"
                                            mongoexport --uri $mongoAccess --collection=$col --type json --out output-$col.json
                                        fi
                                        
                                    done
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 2012-02-10
                                      • 2014-08-15
                                      • 1970-01-01
                                      • 2014-06-02
                                      • 2021-07-05
                                      • 2019-12-14
                                      • 2011-10-12
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多