Як експортувати всі колекції в MongoDB?


319

Я хочу експортувати всі колекції в MongoDB командою:

mongoexport -d dbname -o Mongo.json

Результат:
Колекція не вказана!

Посібник говорить, що якщо ви не вказали колекцію, всі колекції будуть експортовані.
Однак чому це не працює?

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

Моя версія MongoDB - 2.0.6.


2
Яку версію MongoDB ви використовуєте? Вікі-документація для mongoexport передбачає, що це інструмент командного рядка для експорту колекції. Можливо, можливість експорту кількох колекцій призначена для нової версії? Якщо ви хочете створити резервну копію всіх колекцій у базі даних, mongodump експортує всі колекції в BSON.
Стенні

1
Схоже, можливість використання mongoexport для всіх колекцій - це запланована функція, яка ще не запланована: SERVER-201 .. тому mongodump - це найкращий варіант для експорту повної бази даних. Було б не надто складно написати еквівалент mongoexport за допомогою одного з драйверів клієнта MongoDB .
Стенні

2
Ви повинні позначити відповідь як прийняту. Мій голос - за stackoverflow.com/a/16605781/1686575
Джон Манко

Для запису документація MongoDB зазначає уникати використання mongoimport та mongoexport для повних резервних копій виробництва. Вони не надійно зберігають усі багаті типи даних BSON, оскільки JSON може представляти лише підмножину типів, підтримуваних BSON. Використовуйте mongodump і mongorestore, як описано в методах резервного копіювання MongoDB для цього типу функціональності. Отже, це не тільки для ледачих людей, як заявляє Ментор Река, але також є кращим методом цього робити.
samurai_jane

Відповіді:


687

Для ледачих людей використовуйте mongodumpце швидше:

mongodump -d <database_name> -o <directory_backup>

І "відновити / імпортувати" його (з каталогу_backup / dump /):

mongorestore -d <database_name> <directory_backup>

Таким чином, вам не потрібно мати справу з усіма колекціями окремо. Просто вкажіть базу даних.

Зауважте, що я б рекомендував не використовувати mongodump/ mongorestoreдля зберігання великих даних . Це дуже повільно, і як тільки ви отримаєте 10/20 ГБ даних, відновлення може зайняти години.


2
Чи не існує проблеми сумісності між JSON та BSON?
JulienFr

5
Формат даних, який використовується mongodump з версії 2.2 або пізнішої версії, несумісний з більш ранніми версіями mongod. Не використовуйте останні версії mongodump для створення резервних копій старих сховищ даних.
n0nSmoker

4
Я вважав, що команда відновлення - "mongorestore -b DATABASE ./dump-folder" (де ./dump-folder - це шлях або ваші експортовані дані).
Томас Деко

47
"mongorestore -d DATABASE ./dump-folder"
kehers

2
@LucaSteeb використання --excludeCollection = сесії
Zim

60

Я написав для цього сценарій 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

1
Імпортувати: for file in *.json; do c=${file#*exp_yourdbname_}; c=${c%.json}; mongoimport --db yourdbname --collection "${c}" --file "${file}"; done
Бредфорд

Я хочу імпортувати .csv за допомогою пакетного сценарію, у вас є ідея?
Прасант Джая

29

Виконайте наведені нижче дії, щоб створити 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

27

Експорт усіх колекцій за допомогою mongodump використовуйте наступну команду

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і я отримав SyntaxError: missing ; before statementвід CMD. :(
Разван Замфір

18

Будь ласка, повідомте нам, де ви встановили свій DB DB? (або в Ubuntu, або в Windows)

  • Для Windows:

    1. Перш ніж експортувати, потрібно підключитись до DB DB в записі cmd і переконатися, що ви зможете підключитися до свого локального хоста.
    2. Тепер відкрийте новий запит cmd та виконайте команду нижче,

    mongodump - db ім'я бази даних - вихідний шлях для збереження,
    наприклад: mongodump --db mydb --out c: \ TEMP \ op.json

    1. Щоб отримати детальнішу інформацію, відвідайте https://www.youtube.com/watch?v=hOCp3Jv6yKo .
  • Для Ubuntu:

    1. Увійдіть до свого терміналу, де встановлено DB DB, і переконайтеся, що ви зможете підключитися до своєї бази даних Mongo.
    2. Тепер відкрийте новий термінал і виконайте команду нижче,

    mongodump -d назва бази даних -o ім'я файлу для збереження,
    наприклад: mongodump -d mydb -o output.json

    1. Щоб отримати детальнішу інформацію, відвідайте https://www.youtube.com/watch?v=5Fwd2ZB86gg .

12

Попередні відповіді це добре пояснили, я додаю свою відповідь на допомогу у випадку, якщо ви маєте справу з віддаленою базою даних, захищеною паролем

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

10

Якщо ви хочете підключити віддалений сервер mongoDB, як mongolab.com, вам слід передати облікові дані, наприклад.

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

2
Це рішення є найкращим, оскільки воно належним чином відповідає на початкове запитання.
ttemple

Зауважте, що це не надійно зберігає всі багаті типи даних BSON, оскільки JSON може представляти лише підмножину типів, підтримуваних BSON. Використовуйте mongodump і mongorestore, як описано в методах резервного копіювання MongoDB для цього типу функціональності. ( док. )
З. Хулла

8

Якщо ви добре з форматом bson, ви можете використовувати утиліту mongodump з тим самим прапором -d. Він скидає всі колекції у каталог дамп (за замовчуванням можна змінити за допомогою параметра -o) у форматі bson. Потім можна імпортувати ці файли за допомогою утиліти mongorestore.


8

Ви можете скористатися mongo --eval 'printjson(db.getCollectionNames())'для отримання списку колекцій, а потім здійснити монгоекспорт для всіх. Ось приклад у рубіні

  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('"', '') }
Кейсі

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

У мене виникли деякі проблеми з використанням set /p COLLECTIONS=<__collections.txt, отже, перекрученого for /fметоду.


8

Після спроб безлічі суперечливих прикладів я виявив, що для мене спрацював дуже простий підхід.

Я просто хотів взяти дамп db з локального та імпортувати його на віддалений екземпляр:

на локальній машині:

mongodump -d databasename

тоді я scp'd свій дамп на свою серверну машину:

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

то від батьківського dir дампа просто:

mongorestore 

що імпортувало базу даних.

якщо, звичайно, працює служба mongodb.


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;

6

Якщо ви хочете скинути всі колекції у всі бази даних (що є експансивним тлумаченням оригінального наміру запитувача), тоді використовуйте

mongodump

Всі бази даних і колекції будуть створені в каталозі, який називається "дамп" у "поточному" місці


6

Ви можете зробити це з допомогою mongodump команди

Крок 1: Відкрийте командний рядок

Крок 2: перейдіть до папки бін встановлення mongoDB (C: \ Program Files \ MongoDB \ Server \ 4.0 \ bin)

Крок 3: потім виконайте таку команду

mongodump -d your_db_name -o destination_path

your_db_name = тест

target_path = C: \ Користувачі \ HP \ Настільний

Експортовані файли будуть створені у папці dest_path \ your_db_name (у цьому прикладі C: \ Користувачі \ HP \ Desktop \ test)

Список літератури: o7планування


5

Я розумію, що це досить давнє питання, і що mongodump / mongorestore - це явно правильний шлях, якщо ви хочете 100% вірного результату, включаючи індекси.

Однак мені було потрібно швидке і брудне рішення, яке, ймовірно, буде вперед і назад сумісним між старою та новою версіями 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 дзвінки, щоб відтворити індекси.


5

Ви можете створити zip-файл, скориставшись наступною командою. Він створить zip-файл бази даних {dbname}, наданий. Пізніше ви зможете імпортувати наступний zip-файл у вашій БД mongo.

Window filepath=C:\Users\Username\mongo 

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

для більшої наочності використовуйте наступну інформацію docs.mongodb.com/manual/reference/program/mongodump
kumar31rajesh

3

Ось що для мене спрацювало під час відновлення експортованої бази даних:

mongorestore -d 0 ./0 --drop

де ./ містили експортовані файли bson. Зауважте, що --dropзаміна буде замінено наявними даними.


3

якщо ви хочете використовувати 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

2

Якщо ви хочете створити резервну копію всіх dbs на сервері, не турбуючись про те, що виклики dbs викликаються, використовуйте наступний скрипт оболонки:

#!/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, яка створить резервну копію всіх БД, якщо жодна не вказана.

Ви можете помістити це в свою роботу, і воно запуститься лише в тому випадку, якщо процес монгода працює. Він також створить каталог резервного копіювання, якщо такий не існує.

Кожна резервна копія БД записується в окремий каталог, тому ви можете відновити окремі БД з глобального дампа.


2

По-перше, запустіть DB DB - для цього перейдіть до шляху як ->

C: \ Програмні файли \ MongoDB \ Server \ 3.2 \ bin та натисніть на mongod.exe файл щоб запустити сервер MongoDB.

Команда в Windows для експорту

  • Команда експортувати базу даних MongoDB в Windows з "віддаленого сервера" на локальну машину в каталозі C: ​​/ Users / Desktop / temp-folder з віддаленого сервера з внутрішньою IP-адресою та портом.

C:> mongodump --host remote_ip_address: 27017 --db -o C: / Користувачі / Настільний / temp-папка

Команда в Windows для імпорту

  • Команда імпортувати базу даних MongoDB у Windows на "віддалений сервер" з каталогів локальної машини C: / Users / Desktop / temp-folder / db-dir

C:> mongorestore --host = ip --port = 27017 -d C: / Користувачі / Настільний / temp-folder / 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. Відкрийте з'єднання
  2. Запустіть сервер
  3. відкрити новий командний рядок

Експорт:

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)

Це монгоекспорт на експорт
Кирило Дюшон-Доріс

5
Питання стосується експорту всіх колекцій.
JJJ

0

Існує кілька варіантів залежно від того, що ви хочете зробити

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

0

Для демпінгу ваша БД працює нижче CMD

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

-3

Для експорту у форматі JSON зробіть це, дотримуючись команд, які ви можете побачити.

mongoexport --db dbname --collection collectionName --out directoryPATH/JSONfileName.json
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.