首页 文章

如何导出MongoDB中的所有集合?

提问于
浏览
236

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

mongoexport -d dbname -o Mongo.json

结果是:
没有指定集合!

手册说,如果您没有指定集合,则将导出所有集合 .
但是,为什么这不起作用?

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

我的MongoDB版本是2.0.6

22 回答

  • 0

    对于像我这样的懒人,我使用mongodump它更快:

    mongodump -d <database_name> -o <directory_backup>
    

    并且“恢复/导入”,我使用(来自directory_backup / dump /):

    mongorestore -d <database_name> <directory_backup>
    

    使用此解决方案,您不需要逐个添加每个集合并导出 . 只需指定数据库即可 . 我建议不要使用mongodump / mongorestore作为 big data storages . 它非常慢,一旦你超过10 / 20GB的数据,它可能需要数小时才能恢复 .

  • 45

    我为此编写了bash脚本 . 只需运行2个参数(数据库名称,dir来存储文件) .

    #!/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
    
  • 5

    请告诉我们您安装Mongo DB的位置? (在Ubuntu或Windows中)

    • For Windows:

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

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

    mongodump --db数据库名称 - 要保存的路径
    例如:mongodump --db mydb --out c:\ TEMP \ op.json

    mongodump -d数据库名称-o要保存的文件名
    例如:mongodump -d mydb -o output.json

  • 4

    按照以下步骤从服务器创建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
    
  • 14

    使用mongodump导出所有集合使用以下命令

    mongodump -d database_name -o directory_to_store_dumps

    要还原,请使用此命令

    mongorestore -d database_name directory_backup_where_mongodb_tobe_restored
    
  • 521

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

  • 7

    您可以使用 mongo --eval 'printjson(db.getCollectionNames())' 获取集合列表,然后对所有集合执行mongoexport . 这是ruby中的一个例子

    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
    
  • 9

    我需要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 方法 .

  • 6

    如果需要,可以将所有集合导出到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;
    
  • 5

    我在尝试了许多复杂的例子后发现,非常简单的方法对我有效 .

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

    在本地机器上:

    mongodump -d databasename
    

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

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

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

    mongorestore
    

    并导入数据库 .

    假设mongodb服务正在运行 .

  • 0

    如果要将所有集合转储到所有数据库中(这是对原始提问者意图的扩展解释),请使用

    mongodump
    

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

  • 3

    您可以使用以下命令创建zip文件 . 它将创建提供的数据库的zip文件 . 您可以稍后在您的mongo DB中导入以下zip文件 .

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

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

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

    以前的答案解释得很清楚,如果您正在处理远程密码保护的数据库,我正在添加我的答案

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

    这是恢复导出数据库时对我有用的:

    mongorestore -d 0 ./0 --drop

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

  • 1

    我意识到这是一个相当古老的问题,如果你想要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 ,因为我不允许我的应用程序进行通常的 ensureIndex 调用来重新创建索引 .

  • 16

    如果你想使用mongoexport和mongoimport从数据库导出/导入每个集合,我认为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

    如果要备份服务器上的所有dbs,而不必担心调用dbs,请使用以下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实用程序,如果没有指定,它将备份所有数据库 .

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

    每个数据库备份都写入单个目录,因此您可以从全局转储中还原单个数据库 .

  • 3

    您已经可以使用像Robomongo或Mongochef这样的GUI进行此类操作 .

  • 2
    #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
    
  • 8
    • 打开连接

    • 启动服务器

    • 打开新的命令提示符

    出口:

    mongo/bin> 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)
    
  • 7

    要以JSON格式导出,请按照您可以看到的命令执行此操作 .

    mongoexport --db dbname --collection collectionName --out directoryPATH/JSONfileName.json
    

相关问题