Экспорт данных MongoDB

MongoDBBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь использовать утилиту командной строки mongoexport для экспорта данных из базы данных MongoDB. Вы попрактикуетесь в экспорте данных в два распространенных формата: JSON и CSV. Лабораторная работа проведет вас через создание образца набора данных, экспорт всей коллекции, выбор определенных полей для экспорта и использование запросов для фильтрации экспортируемых данных. К концу этой лабораторной работы вы будете уверенно извлекать данные из MongoDB для резервного копирования, анализа или миграции в другие системы.

Экспорт коллекции в JSON

На этом первом этапе вы изучите основной процесс экспорта коллекции MongoDB в файл JSON. JSON (JavaScript Object Notation) — это стандартный формат, который сохраняет богатую, вложенную структуру документов MongoDB, что делает его идеальным для резервного копирования и миграции.

Сначала вам нужно подключиться к серверу MongoDB и создать некоторые образцы данных. Откройте MongoDB Shell, выполнив следующую команду в вашем терминале:

mongosh

Как только вы окажетесь внутри MongoDB Shell, вы увидите новый приглашение. Теперь создайте и переключитесь на новую базу данных с именем exportlab и вставьте три документа в коллекцию users.

use exportlab
db.users.insertMany([
  { name: "Alice", age: 28, email: "alice@example.com", status: "active" },
  { name: "Bob", age: 35, email: "bob@example.com", status: "active" },
  { name: "Charlie", age: 42, email: "charlie@example.com", status: "inactive" }
]);

После вставки документов вы увидите подтверждающее сообщение. Теперь выйдите из MongoDB Shell, чтобы вернуться в обычный терминал.

exit;

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

mongoexport --db=exportlab --collection=users --out=$HOME/project/users.json
  • --db: Указывает базу данных для подключения (exportlab).
  • --collection: Указывает коллекцию для экспорта (users).
  • --out: Указывает путь и имя файла для выходного файла ($HOME/project/users.json).

Чтобы убедиться, что экспорт прошел успешно, просмотрите содержимое только что созданного файла JSON.

cat ~/project/users.json

Вы увидите три вставленных вами документа, каждый на новой строке в формате JSON. Этот формат называется JSONL (JSON Lines), где каждая строка содержит отдельный, полный объект JSON. Обратите внимание, что MongoDB добавляет уникальное поле _id к каждому документу.

{"_id":{"$oid":"656f1a6b..."},"name":"Alice","age":28,"email":"alice@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Bob","age":35,"email":"bob@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Charlie","age":42,"email":"charlie@example.com","status":"inactive"}

Экспорт коллекции в CSV

В то время как JSON отлично подходит для сохранения структуры данных, CSV (Comma-Separated Values) часто удобнее для использования в электронных таблицах или для простого обмена данными. На этом этапе вы экспортируете ту же коллекцию users в файл CSV.

При экспорте в CSV необходимо указать, какие поля следует включить. Это связано с тем, что CSV является плоским, табличным форматом и не может представлять вложенные структуры JSON.

Снова используйте команду mongoexport, но на этот раз добавьте опции --type=csv и --fields. Мы экспортируем поля name, age и email.

mongoexport --db=exportlab --collection=users --type=csv --fields=name,age,email --out=$HOME/project/users.csv
  • --type=csv: Этот флаг указывает mongoexport выводить данные в формате CSV.
  • --fields: Список полей, разделенных запятыми, для включения в экспорт. Порядок, в котором вы их здесь перечисляете, определяет порядок столбцов в файле CSV.

Теперь проверьте содержимое файла users.csv.

cat ~/project/users.csv

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

name,age,email
Alice,28,alice@example.com
Bob,35,bob@example.com
Charlie,42,charlie@example.com

Теперь вы успешно экспортировали одни и те же данные в два разных формата.

Фильтрация данных с помощью запроса

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

На этом этапе вы экспортируете только пользователей со статусом "active". Опция --query принимает JSON-документ, который указывает критерии фильтрации, точно так же, как операция find() в MongoDB Shell.

Выполните следующую команду, чтобы экспортировать только активных пользователей в новый файл JSON с именем active_users.json.

mongoexport --db=exportlab --collection=users --query='{"status": "active"}' --out=$HOME/project/active_users.json
  • --query='{"status": "active"}': Эта опция фильтрует документы, экспортируя только те, у которых поле status равно "active". Обратите внимание на использование одинарных кавычек вокруг JSON-строки, чтобы предотвратить проблемы с интерпретацией оболочкой.

Давайте проверим содержимое экспортированного файла.

cat ~/project/active_users.json

Вывод должен содержать только документы Алисы и Боба, поскольку статус Чарли — "inactive".

{"_id":{"$oid":"656f1a6b..."},"name":"Alice","age":28,"email":"alice@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Bob","age":35,"email":"bob@example.com","status":"active"}

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

Форматирование и ограничение вывода

mongoexport предоставляет дополнительные опции для управления форматом и объемом экспортируемых данных. На этом этапе вы узнаете, как создавать более читаемый для человека "красивый" (pretty) вывод JSON и как ограничить количество документов в вашем экспорте.

Сначала снова экспортируем коллекцию users, но на этот раз с использованием флага --pretty. Это отформатирует вывод JSON с отступами и переносами строк, что сделает его гораздо более удобным для чтения.

mongoexport --db=exportlab --collection=users --pretty --out=$HOME/project/users_pretty.json
  • --pretty: Форматирует вывод JSON для удобства чтения человеком.

Просмотрите отформатированный файл, чтобы увидеть разницу.

cat ~/project/users_pretty.json

Вывод будет аккуратно отформатирован с отступами, примерно так:

[
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Alice",
    "age": 28,
    "email": "alice@example.com",
    "status": "active"
  },
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Bob",
    "age": 35,
    "email": "bob@example.com",
    "status": "active"
  },
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Charlie",
    "age": 42,
    "email": "charlie@example.com",
    "status": "inactive"
  }
]

Далее вы будете использовать опцию --limit для экспорта только определенного количества документов. Это полезно для создания небольших файлов с примерами или для тестирования. Давайте экспортируем только первые два документа в файл CSV.

mongoexport --db=exportlab --collection=users --type=csv --fields=name,status --limit=2 --out=$HOME/project/users_limited.csv
  • --limit=2: Ограничивает экспорт максимум 2 документами.

Проверьте содержимое ограниченного CSV-файла.

cat ~/project/users_limited.csv

Как и ожидалось, файл содержит заголовок и только первые две записи пользователей.

name,status
Alice,active
Bob,active

Проверка экспортированных файлов

На заключительном этапе вы попрактикуетесь в использовании распространенных инструментов командной строки Linux для проверки и подтверждения созданных файлов. Это важнейший навык для подтверждения целостности экспортированных данных.

Сначала выведите список всех файлов в вашем каталоге проекта, чтобы увидеть все, что вы создали. Флаги -lh покажут детали в удобном для чтения формате.

ls -lh ~/project/

Вы должны увидеть все файлы .json и .csv из предыдущих шагов.

total 20K
-rw-rw-r-- 1 labex labex 224 Aug 27 15:48  active_users.json
-rw-rw-r-- 1 labex labex  96 Aug 27 15:48  users.csv
-rw-rw-r-- 1 labex labex 344 Aug 27 15:36  users.json
-rw-rw-r-- 1 labex labex  36 Aug 27 15:48  users_limited.csv
-rw-rw-r-- 1 labex labex 410 Aug 27 15:48  users_pretty.json

Далее используйте команду wc -l для подсчета количества строк в ваших файлах. Это быстрый способ проверить количество экспортированных документов.

wc -l ~/project/*.json ~/project/*.csv

Для файлов JSON, где каждый документ находится на одной строке, количество строк равно количеству документов. Для файлов CSV количество строк — это количество строк с данными плюс одна для заголовка.

  2 /home/labex/project/active_users.json
  3 /home/labex/project/users.json
27 /home/labex/project/users_pretty.json
  4 /home/labex/project/users.csv
  3 /home/labex/project/users_limited.csv
39 total

Наконец, вы можете проверить синтаксис JSON-файлов. Обратите внимание, что mongoexport по умолчанию создает формат JSONL (JSON Lines), где каждый документ является отдельным JSON-объектом на своей строке. Чтобы проверить этот формат, вы можете проверять каждую строку по отдельности:

while IFS= read -r line; do
  echo "$line" | python3 -m json.tool > /dev/null
done < ~/project/users.json && echo "All JSON lines are valid"

Если команды выполняются без ошибок, ваши JSON-файлы действительны. Эти методы проверки помогают гарантировать, что ваши экспорты данных полны и корректны.

Резюме

В этой лабораторной работе вы изучили основные функции утилиты mongoexport. Вы начали с создания образца набора данных и выполнения базового экспорта в файл JSON. Затем вы экспортировали те же данные в файл CSV, научившись указывать поля для табличного формата с помощью --fields. Вы также попрактиковались в использовании опции --query для фильтрации данных и экспорта только определенного подмножества документов. Наконец, вы изучили опции форматирования, такие как --pretty для удобочитаемого JSON и --limit для управления количеством экспортируемых записей. Благодаря этим упражнениям вы приобрели практические навыки извлечения данных из MongoDB для различных целей.