我想通过以下命令导出MongoDB中的所有集合:
mongoexport -d dbname -o Mongo.json
结果是:未
指定集合!
该手册说,如果您不指定集合,则将导出所有集合。
但是,为什么不起作用?
http://docs.mongodb.org/manual/reference/mongoexport/#cmdoption-mongoexport--collection
我的MongoDB版本是2.0.6。
我想通过以下命令导出MongoDB中的所有集合:
mongoexport -d dbname -o Mongo.json
结果是:未
指定集合!
该手册说,如果您不指定集合,则将导出所有集合。
但是,为什么不起作用?
http://docs.mongodb.org/manual/reference/mongoexport/#cmdoption-mongoexport--collection
我的MongoDB版本是2.0.6。
Answers:
对于懒惰的人,请使用mongodump
,速度更快:
mongodump -d <database_name> -o <directory_backup>
并“还原/导入”它(从directory_backup / dump /):
mongorestore -d <database_name> <directory_backup>
这样,您无需单独处理所有集合。只需指定数据库。
请注意,我建议不要将mongodump
/ mongorestore
用于大数据存储。这非常慢,一旦获得超过10 / 20GB的数据,它可能要花费数小时才能还原。
我为此写了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
for file in *.json; do c=${file#*exp_yourdbname_}; c=${c%.json}; mongoimport --db yourdbname --collection "${c}" --file "${file}"; done
请让我们知道您在哪里安装了Mongo DB?(在Ubuntu或Windows中)
对于Windows:
mongodump --db数据库名称--out保存路径
例如:mongodump --db mydb --out c:\ TEMP \ op.json
对于Ubuntu:
mongodump -d数据库名称-o要保存的文件名,
例如:mongodump -d mydb -o output.json
如果您想连接诸如mongolab.com之类的远程mongoDB服务器,则应传递连接凭据,例如。
mongoexport -h id.mongolab.com:60599 -u username -p password -d mydb -c mycollection -o mybackup.json
您可以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(/\".+?\"/).map { |s| s.gsub('"', '') }
我需要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
方法。
如果需要,可以将所有集合导出到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;
您可以使用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
我意识到这是一个很老的问题,如果您想要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”)出现两次。我假设数据库是本地的,您不需要传递凭据,但是使用mongo
和mongoexport
。
请注意,我一直grep -v
在丢弃system.indexes
,因为我不希望旧版本的MongoDB尝试从较新的版本中解释系统集合。相反,我允许我的应用程序进行其通常的ensureIndex
调用来重新创建索引。
您可以使用以下命令创建zip文件。它将创建提供的数据库{dbname}的zip文件。您以后可以将以下zip文件导入mongo DB。
Window filepath=C:\Users\Username\mongo
mongodump --archive={filepath}\+{filename}.gz --gzip --db {dbname}
如果您想使用mongoexport和mongoimport从数据库中导出/导入每个集合,我认为此实用程序将对您有所帮助。我已经使用过类似的工具两次;
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
如果要备份服务器上的所有数据库,而不必担心会调用这些数据库,请使用以下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进程正在运行时才能运行。如果不存在备份目录,还将创建备份目录。
每个数据库备份都写入一个单独的目录,因此您可以从全局转储中还原单个数据库。
首先,启动Mongo DB-为此,转到路径->
C:\ Program Files \ MongoDB \ Server \ 3.2 \ bin,然后单击mongod.exe文件以启动MongoDB服务器。
Windows中要导出的命令
C:> mongodump-主机remote_ip_address:27017 --db -o C:/ Users / Desktop / temp-folder
Windows中要导入的命令
C:> mongorestore --host = ip --port = 27017 -d C:/ Users / Desktop / temp-folder / db-dir
#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/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)
有多种选择,取决于您要做什么
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
要以JSON格式导出,请执行以下命令来执行此操作。
mongoexport --db dbname --collection collectionName --out directoryPATH/JSONfileName.json