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

236

Я хочу экспортировать всю коллекцию в 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 .
Показать ещё 1 комментарий
Теги:
export

22 ответа

517

Для ленивых людей, таких как я, я использую mongodump быстрее:

mongodump -d <database_name> -o <directory_backup>

И чтобы "восстановить/импортировать", я использовал (из directory_backup/dump/):

mongorestore -d <database_name> <directory_backup>

С помощью этого решения вам не нужно каждый сбор и экспорт по одному. Просто укажите базу данных. Я бы рекомендовал не использовать mongodump/mongorestore для больших хранилищ данных. Это очень медленно, и как только вы получите 10/20 ГБ данных, может потребоваться несколько часов для восстановления.

  • 2
    Нет ли проблем с совместимостью между JSON и BSON?
  • 5
    Формат данных, используемый mongodump с версии 2.2 или новее, несовместим с более ранними версиями mongod. Не используйте последние версии mongodump для резервного копирования старых хранилищ данных.
Показать ещё 15 комментариев
45

Я написал для этого bash script. Просто запустите его с двумя параметрами (имя базы данных, каталог для хранения файлов).

#!/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
  • 0
    я хочу импортировать .csv, используя пакетный скрипт, у вас есть идеи?
16

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

  • Для Windows:

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

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

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

Для Ubuntu:

  • Войдите в свой терминал, где установлен Mongo DB, и убедитесь, что вы можете подключиться к своей Mongo DB.
  • Теперь откройте новый терминал и выполните следующую команду:

имя базы данных mongodump -d -o имя файла для сохранения
например: mongodump -d mydb -o output.json

  1. Подробнее см. https://www.youtube.com/watch?v=5Fwd2ZB86gg.
13

Выполните следующие шаги, чтобы создать 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
  • 1
    ОТЛИЧНЫЙ ответ! Как раз то, что я искал:]
9

При экспорте всех коллекций с помощью mongodump используйте следующую команду

mongodump -d database_name -o directory_to_store_dumps

Чтобы восстановить эту команду

mongorestore -d database_name directory_backup_where_mongodb_tobe_restored
8

Если вы в порядке с форматом bson, тогда вы можете использовать утилиту mongodump с тем же флагом -d. Он сбрасывает все коллекции в каталог дампа (по умолчанию, может быть изменен с помощью опции -o) в формате bson. Затем вы можете импортировать эти файлы с помощью утилиты mongorestore.

7

Если вы хотите, вы можете экспортировать все коллекции в csv без указания --fields (экспортирует все поля).

Из http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ запустите этот bash script

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

Мне понадобилась версия для Windows script. Эта тема была полезна, поэтому я думал, что внес свой ответ и на нее.

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.

7

Вы можете использовать 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
  • 0
    Это хорошо, но вы, вероятно, захотите, чтобы регулярное выражение out.scan было не жадным. out.scan(/\".+?\"/).map { |s| s.gsub('"', '') }
6

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

mongodump

Все базы данных и коллекции будут созданы в каталоге с именем 'dump' в текущем местоположении

6

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

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

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

mongodump -d databasename

то я scp'd мой дамп на свой сервер:

scp -r dump [email protected]:~

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

mongorestore 

и импортирует базу данных.

Предполагая, что обслуживание mongodb работает, конечно.

5

вы можете создать zip файл, используя следующую команду. Он создаст zip файл с базой данных {dbname}. После этого вы можете импортировать следующий zip файл в вашу mongo DB.

Window filepath=C:\Users\Username\mongo 

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

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

mongoexport -h id.mongolab.com:60599 -u username -p password -d mydb -c mycollection -o mybackup.json
  • 2
    Это решение является лучшим, потому что оно правильно отвечает на оригинальный вопрос.
  • 0
    Обратите внимание, что это не позволяет надежно сохранить все типы данных с расширенным BSON, поскольку JSON может представлять только подмножество типов, поддерживаемых BSON. Используйте mongodump и mongorestore, как описано в методах резервного копирования MongoDB, для такого рода функций. ( документы )
4

Предыдущие ответы объяснили это хорошо, я добавляю свой ответ, чтобы помочь в случае, если вы имеете дело с удаленной защищенной паролем базой данных

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

Я понимаю, что это довольно старый вопрос и что 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 для воссоздания индексов.

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

Уже вы можете делать подобные операции с помощью графического интерфейса, такого как Robomongo или Mongochef.

2

Если вы хотите сделать резервную копию всех dbs на сервере, не беспокоясь о том, что вызывается dbs, используйте следующую оболочку script:

#!/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. Он также создаст каталог резервного копирования, если он не существует.

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

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

Для экспорта в формате JSON сделайте это, следуя командам, которые вы можете видеть.

mongoexport --db dbname --collection collectionName --out directoryPATH/JSONfileName.json
0
  • Откройте соединение
  • Запустите сервер
  • открыть новое командное приглашение

Экспорт

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)
  • 0
    Монгоэкспорт на экспорт
  • 5
    Вопрос об экспорте всех коллекций.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню