如何导出MongoDB中的所有集合?
我想通过命令导出MongoDB中的所有集合:
mongoexport -d dbname -o Mongo.json
结果是:
没有收集指定!
手册说,如果你不指定一个,所有的集合将被导出。
但是,为什么这不能做正确的工作呢?
http://docs.mongodb.org/manual/reference/mongoexport/#cmdoption-mongoexport–collection
我的MongoDB版本是2.0.6
对于像我这样的懒惰的人,我使用mongodump的速度更快:
mongodump -d <database_name> -o <directory_backup>
和“恢复/导入”,我用(从directory_backup /转储/):
mongorestore -d <database_name> <directory_backup>
有了这个解决scheme,你不需要每个集合都一个一个的导出。 只需指定数据库。 我build议不要使用mongodump / mongorestore来存储大数据 。 这是非常缓慢的,一旦你得到10 / 20GB的数据,可能需要几个小时才能恢复。
我为此写了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
请让我们知道您的MongoDB安装位置? (在Ubuntu或Windows中)
-
对于Windows:
- 在导出之前,您必须在cmd提示符下连接到Mongo DB,并确保能够连接到本地主机。
- 现在打开一个新的cmd提示符并执行下面的命令,
mongodump –db数据库名–outpath保存
例如:mongodump – db mydb –out c:\ TEMP \ op.json -
对于Ubuntu:
- login到您的terminalMongo数据库的安装位置,并确保您能够连接到您的Mongo数据库。
- 现在打开一个新的terminal并执行下面的命令,
mongodump -d数据库名称-o要保存的文件名
例如:mongodump -d mydb -o output.json
如果您使用bson格式,则可以使用具有相同-d标志的mongodump实用程序。 它会将所有集合转储到转储目录(默认值,可以通过-o选项进行更改)为bson格式。 然后可以使用mongorestore实用程序导入这些文件。
我需要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;
您可以使用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
我尝试了很多复杂的例子后发现,这个简单的方法对我来说很合适。
我只想从本地获取一个数据库转储并将其导入远程实例:
在本地机器上:
mongodump -d databasename
然后我scp'd我的转储到我的服务器机器:
scp -r dump user@xx.xxx.xxx.xxx:~
然后从转储的父目录简单地说:
mongorestore
并导入数据库。
假设mongodb服务正在运行。
如果你想转储所有数据库中的所有集合(这是对原始提问者的意图的广泛的解释),然后使用
mongodump
所有的数据库和集合将被创build在“当前”位置的“转储”目录中
如果你想连接一个远程mongoDB服务器,如mongolab.com,你应该传递连接凭证,例如。
mongoexport -h id.mongolab.com:60599 -u username -p password -d mydb -c mycollection -o mybackup.json
参考http://www.usingscript.com/import-and-export-example-in-mongodb/
使用mongodump导出所有集合使用以下命令
mongodump -d database_name -o directory_where_mongodb_exists
要恢复使用这个命令
mongorestore -d database_name directory_backup_where_mongodb_tobe_restored
恢复导出的数据库时,以下是我的工作原理:
mongorestore -d 0 ./0 --drop
其中./包含导出的bson文件。 请注意,– --drop
将覆盖现有的数据。
我意识到这是一个相当古老的问题,如果你想要100%忠实的结果,包括索引,mongodump / mongorestore显然是正确的方法。
但是,我需要一个快速和肮脏的解决scheme,如果没有什么特别古怪的事情发生,那么MongoDB的新旧版本之间可能会向前兼容。 为此,我想回答原来的问题。
上面还有其他可以接受的解决scheme,但是这个Unixstream水线比较短而且很好用:
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
调用来重新创build索引。
如果你想使用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进程运行时才会运行。 如果不存在,它也将创build备份目录。
每个数据库备份都被写入到一个单独的目录中,因此您可以从全局转储中恢复单个数据库。
已经可以用像Robomongo或Mongochef这样的GUI来进行那种操作了。
以前的答案解释得很好,我正在添加我的答案,以帮助您处理远程密码保护的数据库
mongodump --host xx.xxx.xx.xx --port 27017 --db your_db_name --username your_user_name --password your_password --out /target/folder/path
- 打开连接
- 启动服务器
- 打开新的命令提示符
出口:
mongo/bin> mongoexport -d webmitta -c domain -o domain-k.json
import:
mongoimport -d dbname -c newCollecionname --file domain-k.json
哪里
webmitta(db name) domain(Collection Name) domain-k.json(output file name)