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

abo*_*udy 284 export mongodb

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

mongoexport -d dbname -o Mongo.json
Run Code Online (Sandbox Code Playgroud)

结果是:
没有指定集合!

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

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

我的MongoDB版本是2.0.6

小智 624

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

mongodump -d <database_name> -o <directory_backup>
Run Code Online (Sandbox Code Playgroud)

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

mongorestore -d <database_name> <directory_backup>
Run Code Online (Sandbox Code Playgroud)

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

  • "mongorestore -d DATABASE ./dump-folder" (46认同)
  • mongodump从2.2或更高版本使用的数据格式与早期版本的mongod不兼容.请勿使用最新版本的mongodump来备份旧数据存储. (5认同)
  • 我相信restore命令是"mongorestore -b DATABASE ./dump-folder"(其中./dump-folder是路径或导出的数据). (4认同)
  • 很好,但是我如何排除集合(会话)? (3认同)
  • JSON和BSON之间是否存在兼容性问题? (2认同)
  • @LucaSteeb使用--excludeCollection = sessions (2认同)

Vah*_*afi 72

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

对于本地

本地转储

mongodump -d mydb -o ./mongo-backup
Run Code Online (Sandbox Code Playgroud)

本地恢复

mongorestore -d mydb ./mongo-backup/mydb
Run Code Online (Sandbox Code Playgroud)

对于远程

远程转储

mongodump --uri "mongodb+srv://Admin:MYPASS@appcluster.15lf4.mongodb.net/mytestdb" -o ./mongo-backup
Run Code Online (Sandbox Code Playgroud)

远程恢复

mongorestore --uri "mongodb+srv://Admin:MYPASS@appcluster.15lf4.mongodb.net/mytestdb" ./mongo-backup/mytestdb
Run Code Online (Sandbox Code Playgroud)

更新:

如果您使用的是 mongo 4.0 您可能会遇到快照错误,那么您可以使用以下参数运行:--forceTableScan浏览此处获取更多信息。错误是这样的:

mongodump error reading collection: BSON field 'FindCommandRequest.snapshot' is an unknown field.
Run Code Online (Sandbox Code Playgroud)


Bor*_*vic 56

我为此编写了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
Run Code Online (Sandbox Code Playgroud)

  • 导入:`for file in *.json; do c=${file#*exp_yourdbname_}; c=${c%.json}; mongoimport --db yourdbname --collection "${c}" --file "${file}"; 完成` (4认同)

Ano*_*dar 28

按照以下步骤从服务器创建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
Run Code Online (Sandbox Code Playgroud)


Usm*_*man 23

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

mongodump -d database_name -o directory_to_store_dumps

要还原,请使用此命令

mongorestore -d database_name directory_backup_where_mongodb_tobe_restored
Run Code Online (Sandbox Code Playgroud)

  • 我执行了 `mongodump -d mongo -o path\to\Desktop\blog` 并得到了一个 `SyntaxError: Missing ; 来自 CMD 的 before 语句。:( (5认同)

小智 17

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

  • 对于Windows:

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

    mongodump --db数据库名称 - 要保存的路径,
    例如: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.


Bin*_*tta 13

您可以使用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 = 测试

目标路径 = C:\Users\HP\Desktop

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

参考资料:o7planning


mar*_*ark 8

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


Kai*_*ang 8

您可以使用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
Run Code Online (Sandbox Code Playgroud)


ada*_*0mb 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
Run Code Online (Sandbox Code Playgroud)

我使用了一些问题set /p COLLECTIONS=<__collections.txt,因此使用了复杂的for /f方法.


Anu*_*thi 8

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

mongoexport -h id.mongolab.com:60599 -u username -p password -d mydb -c mycollection -o mybackup.json
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案是最好的,因为它正确回答了原始问题. (2认同)

Tom*_*ell 8

我意识到这是一个相当古老的问题,如果您想要 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
Run Code Online (Sandbox Code Playgroud)

.json将为每个集合生成一个适当命名的文件。

请注意,数据库名称(“mydatabase”)出现了两次。我假设数据库是本地的,你不需要通过凭据,但它很容易做,既mongomongoexport

请注意,我使用的grep -v是 discard system.indexes,因为我不希望旧版本的 MongoDB 尝试从较新的系统集合中解释系统集合。相反,我允许我的应用程序进行通常的ensureIndex调用来重新创建索引。


kar*_*ivi 8

先前的答案很好地说明了这一点,如果您正在处理受密码保护的远程数据库,我将添加我的答案以提供帮助

mongodump --host xx.xxx.xx.xx --port 27017 --db your_db_name --username your_user_name --password your_password --out /target/folder/path
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 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;
Run Code Online (Sandbox Code Playgroud)


Mis*_*r P 7

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

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

在本地机器上:

mongodump -d databasename
Run Code Online (Sandbox Code Playgroud)

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

scp -r dump user@xx.xxx.xxx.xxx:~
Run Code Online (Sandbox Code Playgroud)

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

mongorestore 
Run Code Online (Sandbox Code Playgroud)

并导入数据库.

假设mongodb服务正在运行.


Ron*_*ndo 6

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

mongodump
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

Window filepath=C:\Users\Username\mongo 

mongodump --archive={filepath}\+{filename}.gz --gzip --db {dbname}
Run Code Online (Sandbox Code Playgroud)


Coc*_*nut 5

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

1. 转储为 gzip 存档

mongodump --uri="mongodb://YOUR_USER_ID:YOUR_PASSWORD@YOUR_HOST_IP/YOUR_DB_NAME" --gzip --archive > YOUR_FILE_NAME
Run Code Online (Sandbox Code Playgroud)

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

mongorestore --uri="mongodb://$targetUser:$targetPwd@$targetHost/$targetDb" --nsFrom="$sourceDb.*" --nsTo="$targetDb.*" --gzip --archive
Run Code Online (Sandbox Code Playgroud)