Làm cách nào để xuất tất cả các bộ sưu tập trong MongoDB?


319

Tôi muốn xuất tất cả các bộ sưu tập trong MongoDB bằng lệnh:

mongoexport -d dbname -o Mongo.json

Kết quả là:
Không có bộ sưu tập được chỉ định!

Hướng dẫn nói, nếu bạn không chỉ định một bộ sưu tập, tất cả các bộ sưu tập sẽ được xuất.
Tuy nhiên, tại sao điều này không hoạt động?

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

Phiên bản MongoDB của tôi là 2.0.6.


2
Phiên bản MongoDB nào bạn đang sử dụng? Tài liệu wiki cho mongoexport cho thấy đây là một công cụ dòng lệnh để xuất bộ sưu tập. Có lẽ khả năng xuất nhiều bộ sưu tập là cho một phiên bản mới hơn? Nếu bạn muốn sao lưu tất cả các bộ sưu tập trong cơ sở dữ liệu, mongodump sẽ xuất tất cả các bộ sưu tập sang BSON.
Stennie

1
Có vẻ như tùy chọn sử dụng mongoexport cho tất cả các bộ sưu tập là một tính năng được lên kế hoạch chưa được lên lịch: SERVER-201 .. vì vậy mongodump hiện là tùy chọn tốt nhất của bạn để xuất cơ sở dữ liệu hoàn chỉnh. Sẽ không quá khó để viết tương đương với mongoexport bằng một trong các trình điều khiển máy khách MongoDB .
Stennie

2
Bạn nên đánh dấu một câu trả lời là được chấp nhận. Phiếu bầu của tôi là cho stackoverflow.com/a/16605781/1686575
John Manko

Đối với bản ghi, tài liệu MongoDB nêu trạng thái Tránh sử dụng mongoimport và mongoexport cho các bản sao lưu sản xuất cá thể đầy đủ. Họ không bảo toàn đáng tin cậy tất cả các loại dữ liệu BSON phong phú, vì JSON chỉ có thể đại diện cho một tập hợp con các loại được BSON hỗ trợ. Sử dụng mongodump và mongorestore như được mô tả trong Phương thức sao lưu MongoDB cho loại chức năng này. Vì vậy, nó không chỉ dành cho những người lười biếng như Mentor Reka tuyên bố mà còn là phương pháp ưa thích để làm điều này.
samurai_jane

Câu trả lời:


687

Đối với những người lười biếng, sử dụng mongodump, nó nhanh hơn:

mongodump -d <database_name> -o <directory_backup>

Và để "khôi phục / nhập" nó (từ thư mục_backup / dump /):

mongorestore -d <database_name> <directory_backup>

Bằng cách này, bạn không cần phải xử lý tất cả các bộ sưu tập riêng lẻ. Chỉ cần xác định cơ sở dữ liệu.

Lưu ý rằng tôi sẽ khuyên bạn không nên sử dụng mongodump/ mongorestorecho việc lưu trữ dữ liệu lớn . Nó rất chậm và một khi bạn nhận được 10 / 20GB dữ liệu, có thể mất hàng giờ để khôi phục.


2
Không có vấn đề tương thích giữa JSON và BSON?
JulienFr

5
Định dạng dữ liệu được sử dụng bởi mongodump từ phiên bản 2.2 trở lên không tương thích với các phiên bản mongod trước đó. Không sử dụng các phiên bản gần đây của mongodump để sao lưu các kho dữ liệu cũ hơn.
n0nSmoker

4
Tôi tin rằng lệnh khôi phục là "mongorestore -b DATABASE ./dump-folder" (trong đó ./dump-folder là đường dẫn hoặc dữ liệu đã xuất của bạn).
Thomas Decaux

47
"Mongorestore -d DATABASE ./dump-folder"
kehers 13/03/2015

2
@LucaSteeb sử dụng --excludeCollection = session
Zim

60

Tôi đã viết bash script cho điều đó. Chỉ cần chạy nó với 2 tham số (tên cơ sở dữ liệu, thư mục để lưu trữ tệp).

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

1
Để nhập: for file in *.json; do c=${file#*exp_yourdbname_}; c=${c%.json}; mongoimport --db yourdbname --collection "${c}" --file "${file}"; done
Bradford

Tôi muốn nhập .csv bằng cách sử dụng tập lệnh bó, bạn có ý tưởng gì không?
Prasanth Jaya

29

Thực hiện theo các bước bên dưới để tạo một mongodump từ máy chủ và nhập nó vào một máy chủ / máy cục bộ khác có tên người dùng và mật khẩu

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

27

Xuất tất cả các bộ sưu tập bằng cách sử dụng mongodump sử dụng lệnh sau

mongodump -d database_name -o directory_to_store_dumps

Để khôi phục sử dụng lệnh này

mongorestore -d database_name directory_backup_where_mongodb_tobe_restored

Tôi đã làm mongodump -d mongo -o path\to\Desktop\blogvà tôi nhận được một SyntaxError: missing ; before statementtừ CMD. :(
Razvan Zamfir

18

Xin vui lòng cho chúng tôi biết nơi bạn đã cài đặt Mongo DB của bạn? (trong Ubuntu hoặc trong Windows)

  • Cho cửa sổ:

    1. Trước khi xuất, bạn phải kết nối với Mongo DB trong dấu nhắc cmd và đảm bảo rằng bạn có thể kết nối với máy chủ cục bộ.
    2. Bây giờ hãy mở một dấu nhắc cmd mới và thực hiện lệnh bên dưới,

    tên cơ sở dữ liệu mongodump --db - đường dẫn để lưu,
    ví dụ: mongodump --db mydb --out c: \ TEMP \ op.json

    1. Truy cập https://www.youtube.com/watch?v=hOCp3Jv6yKo để biết thêm chi tiết.
  • Đối với Ubuntu:

    1. Đăng nhập vào thiết bị đầu cuối của bạn nơi Mongo DB được cài đặt và đảm bảo bạn có thể kết nối với Mongo DB của mình.
    2. Bây giờ hãy mở một thiết bị đầu cuối mới và thực hiện lệnh dưới đây,

    mongodump -d tên cơ sở dữ liệu -o tên tệp để lưu
    ví dụ: mongodump -d mydb -o output.json

    1. Truy cập https://www.youtube.com/watch?v=5Fwd2ZB86gg để biết thêm chi tiết.

12

Các câu trả lời trước đã giải thích rất rõ, tôi đang thêm câu trả lời của mình để trợ giúp trong trường hợp bạn đang xử lý cơ sở dữ liệu được bảo vệ bằng mật khẩu từ xa

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

10

Trong trường hợp bạn muốn kết nối máy chủ mongoDB từ xa như mongolab.com, bạn nên chuyển thông tin đăng nhập kết nối, vd.

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

2
Giải pháp này là tốt nhất vì nó trả lời đúng câu hỏi ban đầu.
ttemple

Lưu ý rằng điều này không đáng tin cậy bảo tồn tất cả các loại dữ liệu BSON phong phú, bởi vì JSON chỉ có thể đại diện cho một tập hợp con của các loại được BSON hỗ trợ. Sử dụng mongodump và mongorestore như được mô tả trong Phương thức sao lưu MongoDB cho loại chức năng này. ( tài liệu )
Z. Khullah 16/11/18

8

Nếu bạn ổn với định dạng bson, thì bạn có thể sử dụng tiện ích mongodump với cờ -d tương tự. Nó sẽ kết xuất tất cả các bộ sưu tập vào thư mục dump (mặc định, có thể được thay đổi thông qua tùy chọn -o) ở định dạng bson. Sau đó, bạn có thể nhập các tệp này bằng tiện ích mongorestore.


8

Bạn có thể sử dụng mongo --eval 'printjson(db.getCollectionNames())'để có được danh sách các bộ sưu tập và sau đó thực hiện một mongoexport trên tất cả chúng. Đây là một ví dụ trong 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

Điều này là tốt, nhưng bạn có thể muốn regex out.scan không tham lam. out.scan(/\".+?\"/).map { |s| s.gsub('"', '') }
casey

8

Tôi cần phiên bản tập lệnh Windows. Chủ đề này rất hữu ích, vì vậy tôi nghĩ rằng tôi cũng đóng góp câu trả lời của mình cho nó.

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

Tôi đã có một số vấn đề bằng cách sử dụng set /p COLLECTIONS=<__collections.txt, do đó for /fphương pháp phức tạp .


8

Tôi đã tìm thấy sau khi thử rất nhiều ví dụ phức tạp mà cách tiếp cận rất đơn giản đã có hiệu quả với tôi.

Tôi chỉ muốn lấy một db từ cục bộ và nhập nó vào một ví dụ từ xa:

trên máy cục bộ:

mongodump -d databasename

sau đó tôi chuyển rác của mình sang máy chủ của mình:

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

sau đó từ thư mục gốc của kết xuất đơn giản:

mongorestore 

và đã nhập cơ sở dữ liệu.

giả sử dịch vụ mongodb đang chạy tất nhiên.


7

Nếu bạn muốn, bạn có thể xuất tất cả các bộ sưu tập sang csv mà không chỉ định --fields(sẽ xuất tất cả các trường).

Từ http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ chạy tập lệnh bash này

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;

6

Nếu bạn muốn kết xuất tất cả các bộ sưu tập trong tất cả các cơ sở dữ liệu (đó là một cách giải thích mở rộng về ý định của người hỏi ban đầu) thì hãy sử dụng

mongodump

Tất cả các cơ sở dữ liệu và bộ sưu tập sẽ được tạo trong một thư mục có tên 'dump' ở vị trí 'hiện tại'


6

Bạn có thể làm điều đó bằng lệnh mongodump

Bước 1: Mở dấu nhắc lệnh

Bước 2: chuyển đến thư mục bin của bản cài đặt mongoDB của bạn (C: \ Program Files \ MongoDB \ Server \ 4.0 \ bin)

Bước 3: sau đó thực hiện lệnh sau

mongodump -d your_db_name -o destination_path

your_db_name = kiểm tra

Destination_path = C: \ Users \ HP \ Desktop

Các tệp đã xuất sẽ được tạo trong thư mục Destination_path \ your_db_name (trong ví dụ này C: \ Users \ HP \ Desktop \ test)

Tài liệu tham khảo: o7planning


5

Tôi nhận ra rằng đây là một câu hỏi khá cũ và mongodump / mongorestore rõ ràng là cách đúng đắn nếu bạn muốn một kết quả trung thực 100%, bao gồm các chỉ số.

Tuy nhiên, tôi cần một giải pháp nhanh và bẩn có khả năng tương thích ngược và ngược giữa các phiên bản cũ và mới của MongoDB, miễn là không có gì đặc biệt xảy ra. Và vì điều đó tôi muốn câu trả lời cho câu hỏi ban đầu.

Có những giải pháp khác được chấp nhận ở trên, nhưng đường dẫn Unix này tương đối ngắn và ngọt ngào:

mongo --quiet mydatabase --eval "db.getCollectionNames().join('\n')" | \
grep -v system.indexes | \
xargs -L 1 -I {} mongoexport -d mydatabase -c {} --out {}.json

Điều này tạo ra một .jsontệp có tên thích hợp cho mỗi bộ sưu tập.

Lưu ý rằng tên cơ sở dữ liệu ("mydatabase") xuất hiện hai lần. Tôi giả sử cơ sở dữ liệu là cục bộ và bạn không cần phải thông tin đăng nhập nhưng thật dễ dàng để làm điều đó với cả mongomongoexport.

Lưu ý rằng tôi đang sử dụng grep -vđể loại bỏ system.indexes, vì tôi không muốn phiên bản cũ hơn của MongoDB sẽ cố gắng diễn giải một bộ sưu tập hệ thống từ một phiên bản mới hơn. Thay vào đó, tôi cho phép ứng dụng của mình thực hiện các ensureIndexcuộc gọi thông thường để tạo lại các chỉ mục.


5

bạn có thể tạo tệp zip bằng cách sử dụng lệnh sau. Nó sẽ tạo tệp zip của cơ sở dữ liệu {dbname} được cung cấp. Sau này bạn có thể nhập tệp zip sau trong DB mongo của bạn.

Window filepath=C:\Users\Username\mongo 

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

để rõ ràng hơn, hãy sử dụng thông tin sau docs.mongodb.com/manual/reference/program/mongodump
kumar31rajesh

3

Đây là những gì làm việc cho tôi khi khôi phục cơ sở dữ liệu đã xuất:

mongorestore -d 0 ./0 --drop

trong đó ./contained các tập tin bson xuất khẩu. Lưu ý rằng --dropsẽ ghi đè lên dữ liệu hiện có.


3

Nếu bạn muốn sử dụng mongoexportmongoimport để xuất / nhập từng bộ sưu tập từ cơ sở dữ liệu, tôi nghĩ tiện ích này có thể hữu ích cho bạn. Tôi đã sử dụng tiện ích tương tự vài lần;

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

2

Nếu bạn muốn sao lưu tất cả các dbs trên máy chủ, mà không phải lo lắng về việc các dbs được gọi, hãy sử dụng tập lệnh shell sau:

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

Điều này sử dụng tiện ích mongodump, sẽ sao lưu tất cả các DB nếu không được chỉ định.

Bạn có thể đặt cái này trong cronjob của bạn và nó sẽ chỉ chạy nếu quá trình mongod đang chạy. Nó cũng sẽ tạo thư mục sao lưu nếu không tồn tại.

Mỗi bản sao lưu DB được ghi vào một thư mục riêng, vì vậy bạn có thể khôi phục các DB riêng lẻ từ kết xuất toàn cục.


2

Đầu tiên, trong Bắt đầu DB Mongo - để đi đến đường dẫn là ->

C: \ Files Files \ MongoDB \ Server \ 3.2 \ bin và nhấp vào tệp mongod.exe để khởi động máy chủ MongoDB.

Lệnh trong Windows để xuất

  • Lệnh xuất cơ sở dữ liệu MongoDB trong Windows từ "máy chủ từ xa" sang máy cục bộ trong thư mục C: / Users / Desktop / temp-thư mục từ máy chủ từ xa có địa chỉ IP và cổng bên trong.

C:> mongodump --host remote_ip_address: 27017 --db -o C: / Users / Desktop / temp-thư mục

Lệnh trong Windows để nhập

  • Lệnh nhập cơ sở dữ liệu MongoDB trong Windows vào "máy chủ từ xa" từ thư mục máy cục bộ C: / Users / Desktop / temp-thư mục / db-dir

C:> mongorestore --host = ip --port = 27017 -d C: / Users / Desktop / temp-thư mục / db-dir


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

0
  1. Mở kết nối
  2. Khởi động máy chủ
  3. mở dấu nhắc lệnh mới

Xuất khẩu:

mongo/bin> mongoexport -d webmitta -c domain -o domain-k.json

Nhập khẩu:

mongoimport -d dbname -c newCollecionname --file domain-k.json

Ở đâu

webmitta(db name)
domain(Collection Name)
domain-k.json(output file name)

Đó là mongoexport để xuất khẩu
Cyril Duchon-Doris

5
Câu hỏi là về việc xuất tất cả các bộ sưu tập.
JJJ

0

Có nhiều lựa chọn tùy thuộc vào những gì bạn muốn làm

1) Nếu bạn muốn xuất cơ sở dữ liệu của mình sang cơ sở dữ liệu mongo khác, bạn nên sử dụng mongodump. Điều này tạo ra một thư mục các tệp BSON có siêu dữ liệu mà JSON sẽ không có.

mongodump
mongorestore --host mongodb1.example.net --port 37017 dump/

2) Nếu bạn muốn xuất cơ sở dữ liệu của mình sang JSON, bạn có thể sử dụng mongoexportngoại trừ bạn phải thực hiện một bộ sưu tập tại một thời điểm (đây là theo thiết kế). Tuy nhiên tôi nghĩ rằng dễ dàng nhất để xuất toàn bộ cơ sở dữ liệu mongodumpvà sau đó chuyển đổi sang 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

0

Đối với kết xuất, DB của bạn bỏ qua CMD bên dưới

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

-3

Để xuất ở định dạng JSON, hãy làm điều này bằng cách làm theo các lệnh mà bạn có thể thấy.

mongoexport --db dbname --collection collectionName --out directoryPATH/JSONfileName.json
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.