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

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

mongoexport -d dbname -o Mongo.json

结果是:
没有指定集合!< / p >

手册说,如果你没有指定一个集合,所有的集合都将被导出 然而,为什么这行不通呢?< / p >

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

我的MongoDB版本是2.0.6。

420644 次浏览

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

我为此写了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
你可以使用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

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

对于懒人,使用mongodump,它更快:

mongodump -d <database_name> -o <directory_backup>

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

mongorestore -d <database_name> <directory_backup>

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

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

如果你想使用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

如果你愿意,你可以将所有集合导出到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;

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

我只是想从本地转储一个db,并将它导入到一个远程实例:

在本地机器:

mongodump -d databasename

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

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

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

mongorestore

然后导入数据库。

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

如果你想备份服务器上的所有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

这将使用mongodb实用程序,如果没有指定,该实用程序将备份所有db。

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

每个DB备份都被写入一个单独的目录,因此您可以从全局转储恢复各个DB。

  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)

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

mongodump

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

请让我们知道您在哪里安装了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获取更多详细信息。

如果你想连接远程mongoDB服务器,比如mongolab.com,你应该传递连接凭证 如:< / p >
mongoexport -h id.mongolab.com:60599 -u username -p password -d mydb -c mycollection -o mybackup.json

导出所有集合:

mongodump -d database_name -o directory_to_store_dumps

要恢复它们:

mongorestore -d database_name directory_backup_where_mongodb_tobe_restored

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

mongorestore -d 0 ./0 --drop

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

我意识到这是一个相当老的问题,如果你想要100%的忠实结果(包括索引),mongodb /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调用来重新创建索引。

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

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

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

Window filepath=C:\Users\Username\mongo


mongodump --archive={filepath}\+{filename}.gz --gzip --db {dbname}

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

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

首先,启动Mongo DB的路径为->

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

命令在Windows中导出

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

命令在Windows中导入

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

有多种选择,这取决于你想做什么

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

对于转储,您的DB使用下面的CMD命令

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

你可以使用mongodump命令来实现

步骤1:打开命令提示符

第二步:打开mongoDB安装的bin文件夹(C:\Program Files\ mongoDB \Server\4.0\bin)

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

mongodump -d your_db_name -o destination_path

Your_db_name = test

destination_path = C:\Users\HP\Desktop

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

引用:o7planning

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

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

我转储robo3t上的所有收集。 我在vagrant/homestead上运行下面的命令。这是我的工作

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

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

1. 转储为gzip存档

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

2. 恢复(将数据库从一个数据库复制到另一个数据库)

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

如果你有这个问题: 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. < / p >

然后添加--authenticationDatabase admin

例如:

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

一些选项现在已弃用,在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/

这是我用来实现该结果的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

对于本地和远程转储和恢复:

为当地

当地的转储

mongodump -d mydb -o ./mongo-backup

当地的恢复

mongorestore -d mydb ./mongo-backup/mydb

为远程

远程转储

mongodump --uri "mongodb+srv://Admin:MYPASS@appcluster.15lf4.mongodb.net/mytestdb" -o ./mongo-backup

远程恢复

mongorestore --uri "mongodb+srv://Admin:MYPASS@appcluster.15lf4.mongodb.net/mytestdb" ./mongo-backup/mytestdb

更新:

如果你正在使用mongo 4.0,你可能会遇到快照的错误,然后你可以运行这个参数:--forceTableScan在这里看到的获取更多信息。错误是这样的:

mongodump error reading collection: BSON field 'FindCommandRequest.snapshot' is an unknown field.

这是达到你的目标最简单的方法

mongodump -d db_name -o path/filename.json

通过这个命令导出整个Mongo DB

mongoexport –db database_name –collection collection_name –out path_or_filename.json
我做了一个bash脚本,以导出具有相同集合名称的所有db。 例如:你有2个db test1, test2。它们包括收集记录,所以你可以设置——收集=记录.

. 0

脚本将创建dump-{date}/test1。json,转储-{日期}/ test2.json。

    #!/bin/bash
dbs=$(mongosh --quiet --eval "db.getMongo().getDBNames()")
    

i=0
doNotExport=("admin" "local" "config")
date=$(date '+%Y-%m-%d')
    

for db in $dbs; do
if [[ "$db" != "[" && "$db" != "]" ]]
then
replace=`echo "$db" | sed 's/\x27//g'`
replace=`echo "$replace" | sed 's/,//;'`
if [[ ! " ${doNotExport[*]} " =~ " ${replace} " ]]; then
mongoexport --db=$replace --collection={your_collection_name} --out=dump-$date/$replace.json --jsonArray
fi
fi
done