Transformar Dados do MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como transformar dados no MongoDB usando seu poderoso pipeline de agregação. O pipeline de agregação permite processar dados através de uma série de estágios, possibilitando transformações complexas, análises e relatórios. Você começará configurando um conjunto de dados de exemplo e, em seguida, passará por várias técnicas de transformação chave, incluindo a seleção e renomeação de campos, o cálculo de novos campos a partir de dados existentes, a formatação da saída e a filtragem de documentos com base em critérios específicos. Ao final deste laboratório, você terá uma base sólida para manipular dados dentro do MongoDB.

Configuração e Seleção Básica de Campos

Nesta primeira etapa, você se conectará ao servidor MongoDB, criará um banco de dados e uma coleção, e inserirá alguns dados de exemplo. Em seguida, realizará sua primeira transformação de dados selecionando e renomeando campos específicos dos documentos.

Primeiro, abra seu terminal e inicie o MongoDB Shell (mongosh). Este shell interativo é a principal forma de interagir com sua instância MongoDB. Você realizará todas as operações de banco de dados dentro deste shell pelo restante do laboratório.

mongosh

Assim que estiver dentro do MongoDB Shell, seu prompt mudará. Agora, crie e mude para um novo banco de dados chamado bookstore. Se o banco de dados não existir, este comando o criará.

use bookstore

Em seguida, crie uma coleção chamada books e insira três documentos de exemplo nela usando o comando insertMany. Uma coleção é um grupo de documentos, semelhante a uma tabela em um banco de dados SQL.

db.books.insertMany([
  {
    title: "MongoDB Basics",
    author: "Jane Smith",
    price: 29.99,
    pages: 250,
    categories: ["Database", "Programming"]
  },
  {
    title: "Python Deep Dive",
    author: "John Doe",
    price: 39.99,
    pages: 450,
    categories: ["Programming", "Python"]
  },
  {
    title: "Data Science Handbook",
    author: "Alice Johnson",
    price: 49.99,
    pages: 600,
    categories: ["Data Science", "Programming"]
  }
]);

Agora que você tem dados, vamos usar o pipeline de agregação para transformá-los. O método aggregate recebe um array de estágios, onde cada estágio realiza uma operação nos dados. Nosso primeiro estágio será o $project, que remodela os documentos.

Execute o seguinte comando para selecionar apenas os campos title e author, renomeando-os para bookTitle e bookAuthor respectivamente.

db.books.aggregate([
  {
    $project: {
      _id: 0,
      bookTitle: "$title",
      bookAuthor: "$author"
    }
  }
]);

Você deverá ver a seguinte saída:

[
  { "bookTitle": "MongoDB Basics", "bookAuthor": "Jane Smith" },
  { "bookTitle": "Python Deep Dive", "bookAuthor": "John Doe" },
  { "bookTitle": "Data Science Handbook", "bookAuthor": "Alice Johnson" }
]

Vamos detalhar o estágio $project:

  • _id: 0 exclui o campo _id padrão da saída. Por padrão, ele é sempre incluído.
  • bookTitle: "$title" cria um novo campo chamado bookTitle e atribui a ele o valor do campo original title. O prefixo $ indica que você está referenciando o valor de um campo.
  • bookAuthor: "$author" renomeia de forma semelhante o campo author para bookAuthor.

Calculando Novos Campos

Na etapa anterior, você selecionou e renomeou campos existentes. Agora, você aprenderá como criar campos totalmente novos realizando cálculos sobre os dados existentes. Para isso, você usará o estágio $addFields, que adiciona novos campos aos documentos sem remover os originais.

Vamos adicionar um novo campo chamado priceWithTax, que calcula o preço do livro incluindo um imposto de 10%.

db.books.aggregate([
  {
    $addFields: {
      priceWithTax: { $multiply: ["$price", 1.1] }
    }
  }
]);

A saída incluirá todos os campos originais mais o novo campo priceWithTax para cada documento:

[
  {
    _id: ObjectId("..."),
    title: 'MongoDB Basics',
    author: 'Jane Smith',
    price: 29.99,
    pages: 250,
    categories: [ 'Database', 'Programming' ],
    priceWithTax: 32.989
  },
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'John Doe',
    price: 39.99,
    pages: 450,
    categories: [ 'Programming', 'Python' ],
    priceWithTax: 43.989
  },
  {
    _id: ObjectId("..."),
    title: 'Data Science Handbook',
    author: 'Alice Johnson',
    price: 49.99,
    pages: 600,
    categories: [ 'Data Science', 'Programming' ],
    priceWithTax: 54.989
  }
]

Neste pipeline:

  • $addFields é o estágio usado para adicionar novos campos.
  • priceWithTax é o nome do novo campo que você está criando.
  • $multiply é um operador de agregação que recebe um array de dois números e os multiplica. Aqui, ele multiplica o valor do campo price por 1.1.

Formatando Dados de Saída

Os dados são frequentemente mais úteis quando formatados corretamente. Nesta etapa, você aprenderá a formatar dados de string e numéricos usando vários operadores de agregação dentro de um estágio $project. Isso é útil para preparar dados para exibição em aplicativos ou relatórios.

Vamos criar uma saída mais legível convertendo o título do livro para maiúsculas e formatando o preço como uma string de moeda.

db.books.aggregate([
  {
    $project: {
      _id: 0,
      titleUpperCase: { $toUpper: "$title" },
      formattedPrice: {
        $concat: [{ $literal: "$" }, { $toString: "$price" }]
      }
    }
  }
]);

A saída esperada mostrará os dados transformados:

[
  {
    "titleUpperCase": "MONGODB BASICS",
    "formattedPrice": "$29.99"
  },
  {
    "titleUpperCase": "PYTHON DEEP DIVE",
    "formattedPrice": "$39.99"
  },
  {
    "titleUpperCase": "DATA SCIENCE HANDBOOK",
    "formattedPrice": "$49.99"
  }
]

Vamos examinar os operadores usados neste estágio $project:

  • $toUpper: Este operador converte uma string para maiúsculas. Nós o aplicamos ao campo title.
  • $concat: Este operador concatena um array de strings. Nós o usamos para adicionar um prefixo de cifrão $ ao preço.
  • $literal: Este operador é usado para representar valores literais que, de outra forma, seriam interpretados como expressões. Aqui usamos { $literal: "$" } para representar um caractere literal de cifrão.
  • $toString: Como $concat só funciona com strings, primeiro tivemos que converter o campo numérico price em uma string usando o operador $toString.

Filtrando Resultados com $match

A última técnica fundamental que você aprenderá é a filtragem. O estágio $match permite selecionar apenas os documentos que atendem a critérios específicos, semelhante à cláusula WHERE em SQL. É um dos estágios mais comuns em um pipeline de agregação.

Vamos encontrar todos os livros que custam mais de $35.

db.books.aggregate([
  {
    $match: {
      price: { $gt: 35 }
    }
  }
]);

A saída conterá apenas os dois livros que correspondem ao filtro:

[
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'John Doe',
    price: 39.99,
    pages: 450,
    categories: [ 'Programming', 'Python' ]
  },
  {
    _id: ObjectId("..."),
    title: 'Data Science Handbook',
    author: 'Alice Johnson',
    price: 49.99,
    pages: 600,
    categories: [ 'Data Science', 'Programming' ]
  }
]

O estágio $match usa a sintaxe de consulta padrão do MongoDB.

  • price: { $gt: 35 } especifica a condição de filtro. Ele seleciona documentos onde o campo price é maior que ($gt) 35.

Você também pode encadear estágios para criar pipelines mais complexos. Por exemplo, você pode filtrar os documentos primeiro e depois projetar uma saída personalizada a partir dos resultados.

db.books.aggregate([
  {
    $match: {
      price: { $gt: 35 }
    }
  },
  {
    $project: {
      _id: 0,
      title: 1,
      price: 1
    }
  }
]);

Este pipeline primeiro filtra os livros caros usando $match e, em seguida, para esses resultados, usa $project para mostrar apenas o title e o price. A sintaxe title: 1 em $project é uma forma abreviada de incluir um campo.

A saída final é filtrada e projetada:

[
  { "title": "Python Deep Dive", "price": 39.99 },
  { "title": "Data Science Handbook", "price": 49.99 }
]

Para sair do shell do MongoDB, você pode digitar exit ou pressionar Ctrl+D.

Resumo

Neste laboratório, você aprendeu as operações fundamentais do pipeline de agregação do MongoDB. Você começou inserindo dados e, em seguida, usou uma série de estágios para transformá-los. Você praticou a seleção e renomeação de campos com $project, a criação de novos campos calculados com $addFields, a alteração da aparência dos dados com operadores de formatação como $toUpper e $concat, e a filtragem de documentos com $match. Ao combinar esses estágios, você pode construir pipelines sofisticados de processamento de dados para analisar e remodelar seus dados diretamente no banco de dados, o que é uma abordagem poderosa e eficiente para manipulação de dados.