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


319

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

mongoexport -d dbname -o Mongo.json

结果是:未
指定集合!

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

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

我的MongoDB版本是2.0.6。


2
您正在使用哪个版本的MongoDB?mongoexport的Wiki文档建议这是用于导出集合的命令行工具。也许导出多个集合的功能是针对较新的版本?如果要备份数据库中的所有集合,mongodump会将所有集合导出到BSON。
Stennie 2012年

1
似乎尚未计划对所有集合使用mongoexport的选项是尚未计划的计划功能:SERVER-201 ..因此,mongodump当前是导出完整数据库的最佳选择。使用一个MongoDB客户端驱动程序编写等价的mongoexport并不太难。
Stennie 2012年

2
您应将答案标记为已接受。我的投票是stackoverflow.com/a/16605781/1686575
John Manko '18

作为记录,MongoDB 文档指出避免对完整实例生产备份使用mongoimport和mongoexport。它们不能可靠地保留所有丰富的BSON数据类型,因为JSON只能表示BSON支持的类型的子集。如MongoDB备份方法中所述,使用mongodump和mongorestore来实现这种功能。因此,这不仅适用于Mentor Reka所说的懒惰人,而且也是这样做的首选方法。
samurai_jane

Answers:


687

对于懒惰的人,请使用mongodump,速度更快:

mongodump -d <database_name> -o <directory_backup>

并“还原/导入”它(从directory_backup / dump /):

mongorestore -d <database_name> <directory_backup>

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

请注意,我建议不要将mongodump/ mongorestore用于大数据存储。这非常慢,一旦获得超过10 / 20GB的数据,它可能要花费数小时才能还原。


2
JSON和BSON之间不存在兼容性问题吗?
JulienFr 2014年

5
mongodump从2.2版或更高版本使用的数据格式与mongod的早期版本不兼容。不要使用最新版本的mongodump备份较旧的数据存储。
n0nSmoker 2014年

4
我相信restore命令是“ mongorestore -b DATABASE ./dump-folder”(其中./dump-folder是路径或导出的数据)。
Thomas Decaux

47
“ mongorestore -d DATABASE ./dump-folder”
kehers 2015年

2
@LucaSteeb使用--excludeCollection = sessions
Zim

60

我为此写了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

1
导入: for file in *.json; do c=${file#*exp_yourdbname_}; c=${c%.json}; mongoimport --db yourdbname --collection "${c}" --file "${file}"; done
布拉德福德

我想使用批处理脚本导入.csv,您有什么主意吗?
Prasanth Jaya 2015年

29

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

27

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

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,我SyntaxError: missing ; before statement从CMD 得到了。:(
拉兹万·赞菲尔

18

请让我们知道您在哪里安装了Mongo DB?(在Ubuntu或Windows中)

  • 对于Windows:

    1. 导出之前,您必须在cmd提示符下连接到Mongo DB,并确保您能够连接到本地主机。
    2. 现在打开一个新的cmd提示符并执行以下命令,

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

    1. 访问https://www.youtube.com/watch?v=hOCp3Jv6yKo了解更多详细信息。
  • 对于Ubuntu:

    1. 登录到安装了Mongo DB的终端,并确保您能够连接到Mongo DB。
    2. 现在打开一个新终端并执行以下命令,

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

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

12

先前的答案解释得很好,如果您正在处理受密码保护的远程数据库,我将添加我的答案以提供帮助

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

10

如果您想连接诸如mongolab.com之类的远程mongoDB服务器,则应传递连接凭据,例如。

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

2
此解决方案是最好的,因为它可以正确回答原始问题。
ttemple

请注意,这不能可靠地保留所有丰富的BSON数据类型,因为JSON只能表示BSON支持的类型的子集。如MongoDB备份方法中所述,使用mongodump和mongorestore来实现这种功能。(docs
Z. Khullah

8

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


8

您可以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('"', '') }
casey 2013年

8

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


8

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

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

在本地计算机上:

mongodump -d databasename

然后我将转储到我的服务器上:

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

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

mongorestore 

然后导入数据库。

假设mongodb服务正在运行。


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;

6

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

mongodump

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


6

您可以使用mongodump命令执行此操作

步骤1:打开命令提示符

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

步骤3:然后执行以下命令

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


5

我意识到这是一个很老的问题,如果您想要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调用来重新创建索引。



3

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

mongorestore -d 0 ./0 --drop

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


3

如果您想使用mongoexportmongoimport从数据库中导出/导入每个集合,我认为此实用程序将对您有所帮助。我已经使用过类似的工具两次;

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

2

如果要备份服务器上的所有数据库,而不必担心会调用这些数据库,请使用以下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进程正在运行时才能运行。如果不存在备份目录,还将创建备份目录。

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


2

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

C:\ Program Files \ MongoDB \ Server \ 3.2 \ bin,然后单击mongod.exe文件以启动MongoDB服务器。

Windows中要导出的命令

  • 使用内部IP地址和端口从远程服务器将Windows中的MongoDB数据库从“远程服务器”导出到目录C:/ Users / Desktop / temp-folder中的本地计算机。

C:> mongodump-主机remote_ip_address:27017 --db -o C:/ Users / Desktop / temp-folder

Windows中要导入的命令

  • 将Windows中的MongoDB数据库从本地计算机目录C:/ Users / Desktop / temp-folder / db-dir导入到“远程服务器”的命令

C:> mongorestore --host = ip --port = 27017 -d C:/ Users / Desktop / temp-folder / db-dir


1
#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

0
  1. 打开连接
  2. 启动服务器
  3. 打开新的命令提示符

出口:

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)

它是用于出口的mongoexport
Cyril Duchon-Doris

5
问题是关于导出所有集合。
JJJ 2014年

0

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

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

0

进行转储时,您的数据库将低于以下CMD

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.