Импорт и экспорт базы данных MongoDB в Ubuntu 20.04

Автор выбрал COVID-19 Relief Fund для получения пожертвования в рамках программы Write for DOnations.

Введение

MongoDB — одна из самых популярных СУБД NoSQL. Она отличается масштабируемостью, мощностью и надежностью и удобством в использовании. В этом учебном модуле мы покажем, как импортировать и экспортировать ваши базы данных MongoDB.

Следует отметить, что под импортом и экспортом мы подразумеваем операции с данными в удобном для чтения формате, совместимом с другими программными продуктами. В отличие от импорта и экспорта, операции резервного копирования и восстановления используют специальные двоичные данные MongoDB, обеспечивающие согласованность и целостность данных и сохраняющие специальные атрибуты MongoDB. Таким образом, для переноса данных предпочтительнее использовать процесс резервного копирования и восстановления, если исходные и целевые системы совместимы друг с другом.

В этом учебном модуле мы не описываем задачи резервного копирования, восстановления и миграции. Более подробную информацию можно найти в учебном модуле Резервное копирование, восстановление и миграция баз данных MongoDB в Ubuntu 20.04.

Предварительные требования

Для этого учебного модуля вам потребуется следующее:

  • Один дроплет Ubuntu 20.04, настроенный в соответствии с руководством по начальной настройке сервера Ubuntu 20.04, в том числе пользователь без привилегий root с привилегиями sudo и брандмауэр.
  • СУБД MongoDB, установленная и настроенная согласно указаниям статьи Установка MongoDB в Ubuntu 20.04.
  • Понимание различий между данными JSON и BSON в MongoDB. Подробное описание этих различий можно найти в разделе Шаг 1 — Использование JSON и BSON в MongoDB в нашем учебном модуле Резервное копирование, восстановление и миграция баз данных MongoDB в Ubuntu 20.04.

Шаг 1 — Импортирование информации в MongoDB

Чтобы узнать, как работает импорт информации в MongoDB, мы используем популярный образец базы данных MongoDB — базу о ресторанах. Эта база имеет формат json, и ее можно загрузить с помощью wget следующим образом:

  • wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

После завершения загрузки в текущем каталоге должен быть файл primer-dataset.json (размер 12 Мбайт). Импортируем данные из этого файла в новую базу данных newdb и в коллекцию restaurants.

Используйте команду mongoimport следующим образом:

  • sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json

Результат будет выглядеть вот так:

Output2020-11-11T19:37:55.607+0000    connected to: mongodb://localhost/ 2020-11-11T19:37:57.841+0000    25359 document(s) imported successfully. 0 document(s) failed to import 

Как показывает приведенная выше команда, были импортированы 25359 документов. Поскольку у нас не было базы данных с именем newdb, MongoDB создала ее автоматически.

Давайте проверим импорт.

Подключитесь к только что созданной базе данных newdb:

  • sudo mongo newdb

Вы подключились к экземпляру базы данных newdb. Обратите внимание, что ваша командная строка изменилась. Это означает, что вы подключены к базе данных.

Подсчитайте число документов в коллекции restaraunts с помощью команды:

  • db.restaurants.count()

Будет выведен результат 25359, т. е. количество импортированных документов. Для еще более эффективной проверки вы можете выбрать первый документ из коллекции restaraunts следующим образом:

  • db.restaurants.findOne()

Результат будет выглядеть вот так:

[secondary label Output] {     "_id" : ObjectId("5fac3d937f12c471b3f26733"),     "address" : {         "building" : "1007",         "coord" : [             -73.856077,             40.848447         ],         "street" : "Morris Park Ave",         "zipcode" : "10462"     },     "borough" : "Bronx",     "cuisine" : "Bakery",     "grades" : [         {             "date" : ISODate("2014-03-03T00:00:00Z"),             "grade" : "A",             "score" : 2         }, ...     ],     "name" : "Morris Park Bake Shop",     "restaurant_id" : "30075445" } 

Такая детальная проверка может выявить проблемы с содержанием документа, кодировкой и т. д. Формат json использует кодировку UTF-8, и ваши операции экспорта и импорта также должны использовать эту кодировку. Это необходимо помнить при редактировании файлов json вручную. В противном случае MongoDB автоматически сделает это за вас.

Чтобы выйти из командной строки MongoDB, введите команду exit:

  • exit

Вы вернетесь в обычную командную строку как пользователь без привилегий root.

Шаг 2 — Экспорт информации из MongoDB

Как мы уже упоминали, при экспорте информации MongoDB вы можете получить удобный для чтения файлы с вашими данными. По умолчанию экспорт выполняется в формате json, но также вы можете использовать для экспорта формат csv (разделенные запятыми значения).

Чтобы экспортировать информацию из MongoDB, используйте команду mongoexport. Это позволяет выполнять детализированный экспорт с указанием базы данных, коллекции, поля, или даже с использованием запроса для экспорта.

Простой пример работы команды mongoexport — экспорт коллекции restaurants из базы данных newdb, куда мы ее до этого импортировали. Это можно сделать следующим образом:

  • sudo mongoexport --db newdb -c restaurants --out newdbexport.json

В команде выше мы используем --db для определения базы данных, -c для определения коллекции и --out для определения файла, куда будут сохранены данные.

Вывод успешной команды mongoexport должен выглядеть вот так:

Output2020-11-11T19:39:57.595+0000    connected to: mongodb://localhost/ 2020-11-11T19:39:58.619+0000    [###############.........]  newdb.restaurants  16000/25359  (63.1%) 2020-11-11T19:39:58.871+0000    [########################]  newdb.restaurants  25359/25359  (100.0%) 2020-11-11T19:39:58.871+0000    exported 25359 records 

Этот вывод показывает, что было экспортировано 25359 документов, то есть, столько же документов, сколько мы импортировали.

В некоторых случаях, вам может быть нужно экспортировать только часть коллекции. Учитывая структуру и содержание файла restaurants json, давайте экспортируем все рестораны китайской кухни, расположенные в Бронксе. Если мы хотим получить эту информацию напрямую при подключении к MongoDB, нам нужно снова подключиться к базе данных:

  • sudo mongo newdb

Затем, используйте следующий запрос:

  • db.restaurants.find( { "borough": "Bronx", "cuisine": "Chinese" } )

Результаты будут выведены на терминал:

Output
  • 2020-12-03T01:35:25.366+0000 connected to: mongodb://localhost/
  • 2020-12-03T01:35:25.410+0000 exported 323 records

Чтобы выйти из диалогового окна MongoDB, введите exit:

  • exit

Если мы хотим экспортировать данные из командной строки sudo, а не во время подключения к базе данных, предыдущий запрос нужно сделать частью команды mongoexport, указав его после аргумента -q:

  • sudo mongoexport --db newdb -c restaurants -q "{"borough": "Bronx", "cuisine": "Chinese"}" --out Bronx_Chinese_retaurants.json

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

Если экспорт выполнен успешно, результат будет выглядеть вот так:

Output2020-11-11T19:49:21.727+0000    connected to: mongodb://localhost/ 2020-11-11T19:49:21.765+0000    exported 323 records 

Выше показано, что мы экспортировали 323 записи, которые можно будет найти в заданном нами файле Bronx_Chinese_retaurants.json.

Используйте cat и less для сканирования данных:

  • cat Bronx_Chinese_retaurants.json | less

Используйте пробел для прокрутки страниц данных:

Output
  • date":{"$date":"2015-01-14T00:00:00Z"},"grade":"Z","score":36}],"na{"_id":{"$oid":"5fc8402d141f5e54f9054f8d"},"address":{"building":"1236","coord":[-73.8893654,40.81376179999999],"street":"238 Spofford Ave","zipcode":"10474"},"borough":"Bronx","cuisine":"Chinese","grades":[{"date":{"$date":"2013-12-30T00:00:00Z"},"grade":"A","score":8},{"date":{"$date":"2013-01-08T00:00:00Z"},"grade":"A","score":10},{"date":{"$date":"2012-06-12T00:00:00Z"},"grade":"B","score":15}],
  • . . .

Нажмите q, чтобы выйти. Теперь вы можете импортировать и экспортировать базу данных MongoDB.

Заключение

В этом учебном модуле мы познакомили вас с основами экспорта информации из базы данных MongoDB и импорта информации в эту БД. Дополнительную информацию можно найти в учебном модуле Резервное копирование, восстановление и миграция базы данных MongoDB в Ubuntu 20.04.

Также вы можете рассмотреть возможность использования репликации. Репликация позволяет продолжить выполнение службы MongoDB без перебоев на подчиненном сервере MongoDB во время восстановления главного сервера после неисправности. Частью процесса репликации является журнал операций (oplog), где записываются все операции, изменяющие данные. Вы можете использовать этот журнал, как если бы вы использовали двоичный журнал в MySQL для восстановления данных после последнего резервного копирования. Помните, что резервное копирование обычно выполняется ночью, и если вы решите восстановить данные вечером, вы потеряете все изменения, которые произошли с момента создания резервной копии.