Как экспортировать все коллекции в MongoDB?

320

Я хочу экспортировать все коллекции в MongoDB командой:

mongoexport -d dbname -o Mongo.json

Результат:
коллекция не указана!

В руководстве сказано, что если вы не укажете коллекцию, все коллекции будут экспортированы.
Однако, почему это не работает?

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

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

aboutstudy
источник
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>

И «восстановить / импортировать» его (из directory_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 use --excludeCollection = session
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
AnoopGoudar
источник
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

Пожалуйста, дайте нам знать, где вы установили свою БД Mongo? (либо в Ubuntu, либо в Windows)

  • Для Windows:

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

    mongodump - имя базы данных db - путь для сохранения,
    например: mongodump --db mydb --out c: \ TEMP \ op.json

    1. Посетите https://www.youtube.com/watch?v=hOCp3Jv6yKo для получения дополнительной информации.
  • Для Ubuntu:

    1. Войдите в свой терминал, где установлена ​​БД Mongo, и убедитесь, что вы можете подключиться к вашей БД 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
karthikdivi
источник
10

Если вы хотите подключиться к удаленному серверу mongoDB, например, mongolab.com, вы должны передать учетные данные, например.

mongoexport -h id.mongolab.com:60599 -u username -p password -d mydb -c mycollection -o mybackup.json
Anup_Tripathi
источник
2
Это решение является лучшим, потому что оно правильно отвечает на оригинальный вопрос.
храм
Обратите внимание, что это не позволяет надежно сохранить все типы данных с расширенным 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
KailuoWang
источник
Это хорошо, но вы, вероятно, захотите, чтобы регулярное выражение 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метод.

adamb0mb
источник
8

После многих запутанных примеров я обнаружил, что очень простой подход работает для меня.

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

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

mongodump -d databasename

затем я скопировал свой дамп на серверную машину:

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

тогда из родительского каталога дампа просто:

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;
Майкл
источник
7

Вы можете сделать это с помощью mongodump команды

Шаг 1: Откройте командную строку

Шаг 2: перейдите в папку bin вашей установки mongoDB (C: \ Program Files \ MongoDB \ Server \ 4.0 \ bin)

Шаг 3: затем выполните следующую команду

mongodump -d your_db_name -o destination_path

your_db_name = test

destination_path = C: \ Users \ HP \ Desktop

Экспортированные файлы будут созданы в папке destination_path \ your_db_name (в этом примере C: \ Users \ HP \ Desktop \ test)

Рекомендации: o7planning

Бинара Медаватта
источник
6

Если вы хотите сбросить все коллекции во всех базах данных (что является обширной интерпретацией намерения исходного спрашивающего), используйте

mongodump

Все базы данных и коллекции будут созданы в каталоге с именем «dump» в «текущем» месте.

Рондо
источник
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}
kumar31rajesh
источник
для большей ясности используйте следующую информацию docs.mongodb.com/manual/reference/program/mongodump
kumar31rajesh
3

Вот что сработало для меня при восстановлении экспортированной базы данных:

mongorestore -d 0 ./0 --drop

где ./contracted экспортированные файлы bson. Обратите внимание, что --dropбудут перезаписаны существующие данные.

codecowboy
источник
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, которая будет создавать резервные копии всех БД, если они не указаны.

Вы можете поместить это в свой cronjob, и он будет работать, только если запущен процесс mongod. Он также создаст каталог резервного копирования, если он не существует.

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

Гаррет МакДейд
источник
2

Во-первых, из Start the Mongo DB - для этого перейдите по пути как ->

C: \ Program Files \ 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: / Users / Desktop / temp-folder

Команда в 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)
Mani
источник
Это монгоэкспорт на экспорт
Кирилл Дюшон-Дорис
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
Ахмад Шариф
источник