ChatGPT解决这个技术问题 Extra ChatGPT

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

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

mongoexport -d dbname -o Mongo.json

结果是:没有指定集合!

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

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

我的 MongoDB 版本是 2.0.6。

您使用的是哪个版本的 MongoDB? mongoexport 的 wiki 文档建议这是一个用于导出集合的命令行工具。也许导出多个集合的能力是为了更新版本?如果要备份数据库中的所有集合,mongodump 会将所有集合导出到 BSON。
似乎对所有集合使用 mongoexport 的选项是尚未计划的计划功能:SERVER-201 .. 所以 mongodump 目前是导出完整数据库的最佳选择。使用 MongoDB client drivers 之一编写相当于 mongoexport 的内容并不难。
您应该将答案标记为已接受。我投票给stackoverflow.com/a/16605781/1686575
作为记录,MongoDB documentation 声明 避免使用 mongoimport 和 mongoexport 进行完整实例生产备份。它们不能可靠地保留所有丰富的 BSON 数据类型,因为 JSON 只能表示 BSON 支持的类型的子集。使用 MongoDB 备份方法中所述的 mongodump 和 mongorestore 来实现此类功能。 因此,它不仅适用于 Mentor Reka 所说的懒惰的人,而且也是执行此操作的首选方法。
在 mongo 文档中,应指定它作为集合的统计信息You must specify the collection to export.我引用了同一个文档

X
Xavier Guihot

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

mongodump -d <database_name> -o <directory_backup>

并“恢复/导入”它(来自 directory_backup/dump/):

mongorestore -d <database_name> <directory_backup>

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

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


JSON 和 BSON 之间没有兼容性问题吗?
2.2 或更高版本的 mongodump 使用的数据格式与早期版本的 mongod 不兼容。不要使用最新版本的 mongodump 来备份旧的数据存储。
我相信还原命令是“mongorestore -b DATABASE ./dump-folder”(其中 ./dump-folder 是路径或您导出的数据)。
“mongorestore -d 数据库./转储文件夹”
@LucaSteeb 使用 --excludeCollection=sessions
B
Boris Pavlovic

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

导入:for file in *.json; do c=${file#*exp_yourdbname_}; c=${c%.json}; mongoimport --db yourdbname --collection "${c}" --file "${file}"; done
我想使用批处理脚本导入 .csv,你知道吗?
我可以安装什么来使用 mongo 命令?谢了。
通过选择 Community Edition mongodb.com/try/download/community 在此处安装 mongo javascript CLI
X
Xavier Guihot

导出所有集合:

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,我从 CMD 得到了一个 SyntaxError: missing ; before statement。 :(
A
AnoopGoudar

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

V
Vahid Najafi

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

对于本地

本地转储

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,您可能会遇到 快照错误,那么您可以使用以下参数运行:--forceTableScanSee here 了解更多信息。错误是这样的:

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

X
Xavier Guihot

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

对于 Windows:

在导出之前,您必须在 cmd 提示符下连接到 Mongo DB,并确保您能够连接到本地主机。现在打开一个新的 cmd 提示符并执行以下命令, mongodump --db 数据库名称 --out 保存路径 例如: mongodump --db mydb --out c:\TEMP\op.json 访问 https://www.youtube .com/watch?v=hOCp3Jv6yKo 了解更多详情。

对于 Ubuntu:

登录到安装了 Mongo DB 的终端,并确保您能够连接到 Mongo DB。现在打开一个新终端并执行以下命令, mongodump -d 数据库名称 -o 文件名保存 eg: mongodump -d mydb -o output.json 访问 https://www.youtube.com/watch?v=5Fwd2ZB86gg 获取更多细节。


k
karthikdivi

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

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

这也同样有效:mongodump --uri="mongodb://YOUR_USER_ID:YOUR_PASSWORD@YOUR_HOST_IP/YOUR_DB_NAME" --out /target/folder/path
--authenticationDatabase admin 需要时
C
Community

您可以使用 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 = test目的地路径 = C:\Users\HP\Desktop

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

参考文献:o7planning


T
Tom Boutell

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


感谢您回答所提出的确切问题,这对我很有帮助!
答案足够适合这个问题。此命令的用例仅适用于开发迁移。由于 JSON 或 CSV 无法处理 BSON 可以处理的所有数据格式,而 mongodump/mongorestore 工具可以。可以改进为也有 mongoimport 语句。我用它来将数据从 mongo v4.2 迁移到 v4.0。与你在上一段中所说的一致
P
Pogrindis

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

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

这个解决方案是最好的,因为它正确地回答了原始问题。
请注意,这并不能可靠地保留所有丰富的 BSON 数据类型,因为 JSON 只能表示 BSON 支持的类型的子集。使用 MongoDB Backup Methods 中所述的 mongodump 和 mongorestore 来实现此类功能。 (docs)
m
mark

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


C
Coconut

如果您正在处理远程数据库,您可以尝试这些命令,因为您不介意输出是 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

K
KailuoWang

您可以使用 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('"', '') }
我可以安装什么来使用 mongo 命令?谢了。
a
adamb0mb

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


我可以安装什么来使用 mongo 命令?谢了。
这是很久以前的事了……但它只是 MongoDB shell。 mongodb.com/try/download/shell
M
Mister P

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

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

在本地机器上:

mongodump -d databasename

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

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

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

mongorestore 

并导入了数据库。

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


M
Michael

如果需要,您可以在不指定 --fields 的情况下将所有集合导出到 csv(将导出所有字段)。

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;

R
Rondo

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

mongodump

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


最好的和不复杂的方法!!
d
daniele3004

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

Window filepath=C:\Users\Username\mongo 

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

为了更清楚,请使用以下信息 docs.mongodb.com/manual/reference/program/mongodump
c
codecowboy

以下是还原导出数据库时对我有用的方法:

mongorestore -d 0 ./0 --drop

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


M
Matt

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

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

G
Garreth McDaid

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

这使用 mongodump 实用程序,如果没有指定,它将备份所有数据库。

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

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


v
vnguyen

我将所有收藏转储到 robo3t 上。我在 vagrant/homestead 上运行以下命令。这对我有用

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

这行得通。而且命令行很简单。
v
vanduc1102

如果您遇到此问题: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.

然后添加 --authenticationDatabase admin

例如:

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


K
Krishnadas PC

现在不推荐使用某些选项,在版本 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/


A
Adiii

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

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

Windows 中要导出的命令

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

C:\> mongodump --host remote_ip_address:27017 --db <db-name> -o C:/Users/Desktop/temp-folder

Windows 中要导入的命令

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

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

m
manoj tiwari
#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

R
Ryan Taylor

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

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

V
Vlad Hrona

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

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


N
Nayem Jaman Tusher

这是实现目标的最简单技术。

mongodump -d db_name -o 路径/文件名.json


I
Igor Monteiro

打开连接启动服务器打开新的命令提示符

出口:

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
问题是关于导出所有集合。