Exportar Dados do MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a usar a utilidade de linha de comando mongoexport para exportar dados de um banco de dados MongoDB. Você praticará a exportação de dados em dois formatos comuns: JSON e CSV. O laboratório irá guiá-lo através da criação de um conjunto de dados de amostra, exportação de uma coleção inteira, seleção de campos específicos para exportação e uso de consultas para filtrar os dados que você exporta. Ao final deste laboratório, você será proficiente na extração de dados do MongoDB para backups, análises ou migração para outros sistemas.

Exportando uma Coleção para JSON

Nesta primeira etapa, você aprenderá o processo fundamental de exportar uma coleção MongoDB para um arquivo JSON. JSON (JavaScript Object Notation) é um formato padrão que preserva a estrutura rica e aninhada dos documentos MongoDB, tornando-o ideal para backups e migrações.

Primeiro, você precisa se conectar ao servidor MongoDB e criar alguns dados de exemplo. Abra o MongoDB Shell executando o seguinte comando no seu terminal:

mongosh

Assim que estiver dentro do MongoDB Shell, você verá um novo prompt. Agora, crie e mude para um novo banco de dados chamado exportlab e insira três documentos em uma coleção 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" }
]);

Após a inserção dos documentos, você verá uma mensagem de confirmação. Agora, saia do MongoDB Shell para retornar ao seu terminal regular.

exit;

Com os dados no lugar, você pode agora usar a utilidade mongoexport para exportar a coleção users. Este comando especifica o banco de dados, a coleção e o arquivo de saída.

mongoexport --db=exportlab --collection=users --out=$HOME/project/users.json
  • --db: Especifica o banco de dados ao qual se conectar (exportlab).
  • --collection: Especifica a coleção a ser exportada (users).
  • --out: Especifica o caminho e o nome do arquivo de saída ($HOME/project/users.json).

Para confirmar que a exportação foi bem-sucedida, visualize o conteúdo do arquivo JSON recém-criado.

cat ~/project/users.json

Você verá os três documentos que inseriu, cada um em uma nova linha no formato JSON. Este formato é chamado JSONL (JSON Lines), onde cada linha contém um objeto JSON separado e completo. Observe que o MongoDB adiciona um campo _id único a cada documento.

{"_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"}

Exportando uma Coleção para CSV

Enquanto o JSON é excelente para preservar a estrutura de dados, o CSV (Comma-Separated Values) é frequentemente mais conveniente para uso em planilhas ou para troca simples de dados. Nesta etapa, você exportará a mesma coleção users para um arquivo CSV.

Ao exportar para CSV, você deve especificar quais campos incluir. Isso ocorre porque o CSV é um formato plano e tabular e não pode representar estruturas JSON aninhadas.

Use o comando mongoexport novamente, mas desta vez adicione as opções --type=csv e --fields. Exportaremos os campos name, age e email.

mongoexport --db=exportlab --collection=users --type=csv --fields=name,age,email --out=$HOME/project/users.csv
  • --type=csv: Esta flag informa ao mongoexport para gerar a saída no formato CSV.
  • --fields: Uma lista separada por vírgulas de campos a serem incluídos na exportação. A ordem em que você os lista aqui determina a ordem das colunas no arquivo CSV.

Agora, inspecione o conteúdo do arquivo users.csv.

cat ~/project/users.csv

A saída será um formato CSV padrão, com os nomes dos campos como a linha de cabeçalho, seguida pelos dados.

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

Agora você exportou com sucesso os mesmos dados em dois formatos diferentes.

Filtrando Dados com uma Query

Muitas vezes, você não precisa exportar uma coleção inteira. O mongoexport permite que você use uma consulta para filtrar quais documentos são exportados. Isso é útil para extrair subconjuntos específicos dos seus dados.

Nesta etapa, você exportará apenas os usuários que têm um status de "active". A opção --query aceita um documento JSON que especifica os critérios de filtro, assim como uma operação find() no MongoDB Shell.

Execute o seguinte comando para exportar apenas os usuários ativos para um novo arquivo JSON chamado active_users.json.

mongoexport --db=exportlab --collection=users --query='{"status": "active"}' --out=$HOME/project/active_users.json
  • --query='{"status": "active"}': Esta opção filtra os documentos, exportando apenas aqueles onde o campo status é igual a "active". Observe o uso de aspas simples ao redor da string JSON para evitar problemas de interpretação do shell.

Vamos verificar o conteúdo do arquivo exportado.

cat ~/project/active_users.json

A saída deve conter apenas os documentos de Alice e Bob, pois o status de Charlie é "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"}

Essa capacidade de filtragem é poderosa para criar exportações de dados direcionadas sem a necessidade de manipular os dados após a exportação.

Formatando e Limitando a Saída

O mongoexport oferece opções adicionais para controlar o formato e a quantidade de dados que você exporta. Nesta etapa, você aprenderá como criar uma saída JSON "pretty" (mais legível para humanos) e como limitar o número de documentos na sua exportação.

Primeiro, vamos exportar a coleção users novamente, mas desta vez usando a flag --pretty. Isso formatará a saída JSON com indentação e quebras de linha, tornando-a muito mais fácil de ler.

mongoexport --db=exportlab --collection=users --pretty --out=$HOME/project/users_pretty.json
  • --pretty: Formata o JSON de saída para ser legível por humanos.

Visualize o arquivo formatado para ver a diferença.

cat ~/project/users_pretty.json

A saída será bem indentada, assim:

[
  {
    "_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"
  }
]

Em seguida, você usará a opção --limit para exportar apenas um número específico de documentos. Isso é útil para criar pequenos arquivos de amostra ou para testes. Vamos exportar apenas os dois primeiros documentos para um arquivo CSV.

mongoexport --db=exportlab --collection=users --type=csv --fields=name,status --limit=2 --out=$HOME/project/users_limited.csv
  • --limit=2: Restringe a exportação a um máximo de 2 documentos.

Verifique o conteúdo do arquivo CSV limitado.

cat ~/project/users_limited.csv

Como esperado, o arquivo contém o cabeçalho e apenas os dois primeiros registros de usuário.

name,status
Alice,active
Bob,active

Verificando Arquivos Exportados

Nesta etapa final, você praticará o uso de ferramentas comuns de linha de comando do Linux para inspecionar e verificar os arquivos que criou. Esta é uma habilidade crucial para confirmar a integridade das suas exportações de dados.

Primeiro, liste todos os arquivos no seu diretório de projeto para ver tudo o que você criou. As flags -lh mostrarão detalhes em um formato legível por humanos.

ls -lh ~/project/

Você deverá ver todos os arquivos .json e .csv das etapas anteriores.

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

Em seguida, use o comando wc -l para contar o número de linhas nos seus arquivos. Esta é uma maneira rápida de verificar o número de documentos exportados.

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

Para arquivos JSON onde cada documento está em uma linha, a contagem de linhas é igual à contagem de documentos. Para arquivos CSV, a contagem de linhas é o número de linhas de dados mais uma para o cabeçalho.

  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

Finalmente, você pode validar a sintaxe dos arquivos JSON. Observe que o mongoexport cria o formato JSONL (JSON Lines) por padrão, onde cada documento é um objeto JSON separado em sua própria linha. Para validar este formato, você pode verificar cada linha individualmente:

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

Se os comandos forem executados sem erros, seus arquivos JSON são válidos. Essas técnicas de verificação ajudam a garantir que suas exportações de dados sejam completas e corretas.

Resumo

Neste laboratório, você aprendeu as funções essenciais da utilidade mongoexport. Você começou criando um conjunto de dados de exemplo e realizando uma exportação básica para um arquivo JSON. Em seguida, exportou os mesmos dados para um arquivo CSV, aprendendo a especificar campos para um formato tabular com --fields. Você também praticou o uso da opção --query para filtrar dados e exportar apenas um subconjunto específico de documentos. Finalmente, explorou opções de formatação como --pretty para JSON legível por humanos e --limit para controlar o número de registros exportados. Através destes exercícios, você adquiriu habilidades práticas para extrair dados do MongoDB para diversos fins.