Uma loja virtual,
dois bancos de dados.
Cenário
A UrbanCart é um e-commerce de moda urbana. O banco relacional em PostgreSQL funciona bem para controle de pedidos e financeiro — mas a equipe de produto quer explorar MongoDB Atlas para armazenar perfis de clientes enriquecidos, com histórico de compras embutido, preferências de estilo e avaliações variáveis por produto. Sua missão: fazer essa ponte.
Compreender

Interpretar um esquema relacional normalizado com 4 tabelas e seus relacionamentos

Aplicar

Usar IA para converter tabelas SQL em documentos JSON desnormalizados para MongoDB

Analisar

Escrever filtros MongoDB para responder perguntas analíticas de negócio

Avaliar

Comparar a experiência de consulta entre SQL relacional e filtros NoSQL orientados a documento

Estrutura da Atividade
Esta atividade tem 3 tarefas sequenciais. A Tarefa 1 configura o ambiente no MongoDB Atlas. A Tarefa 2 é a conversão SQL → JSON com inserção dos dados. A Tarefa 3 são as 6 consultas analíticas. Você pode (e deve) usar IA para ajudar na conversão — mas as consultas precisam ser compreendidas e documentadas por você.
O banco relacional
da UrbanCart.
Sobre o Esquema
O banco tem 4 tabelas: clientes, produtos, pedidos e itens_pedido. São 8 clientes, 10 produtos e 12 pedidos com múltiplos itens — um volume propositalmente pequeno para caber no tier gratuito do MongoDB Atlas (M0, limite de 512 MB).
UrbanCart — Diagrama de tabelas
UrbanCart ERD
DDL · Criação de tabelas e inserção de dados
-- ============================================================ -- UrbanCart · Banco de Dados Relacional (PostgreSQL) -- Gestão de BD e BI · ESPM · Aula 6 -- ============================================================ -- 1. TABELA CLIENTES CREATE TABLE clientes ( cliente_id SERIAL PRIMARY KEY, nome VARCHAR(100) NOT NULL, email VARCHAR(120) UNIQUE NOT NULL, cidade VARCHAR(60), plano VARCHAR(20) DEFAULT 'gratuito', data_cadastro DATE DEFAULT CURRENT_DATE ); -- 2. TABELA PRODUTOS CREATE TABLE produtos ( produto_id SERIAL PRIMARY KEY, nome VARCHAR(120) NOT NULL, categoria VARCHAR(60), preco NUMERIC(10,2) NOT NULL, estoque INT DEFAULT 0, marca VARCHAR(60) ); -- 3. TABELA PEDIDOS CREATE TABLE pedidos ( pedido_id SERIAL PRIMARY KEY, cliente_id INT REFERENCES clientes(cliente_id), data_pedido DATE DEFAULT CURRENT_DATE, status VARCHAR(30) DEFAULT 'pendente', valor_total NUMERIC(10,2), canal VARCHAR(20) ); -- 4. TABELA ITENS_PEDIDO CREATE TABLE itens_pedido ( item_id SERIAL PRIMARY KEY, pedido_id INT REFERENCES pedidos(pedido_id), produto_id INT REFERENCES produtos(produto_id), quantidade INT NOT NULL, preco_unit NUMERIC(10,2) NOT NULL ); -- ========================================================== -- DADOS SINTÉTICOS -- ========================================================== -- CLIENTES (8 registros) INSERT INTO clientes (nome, email, cidade, plano, data_cadastro) VALUES ('Ana Beatriz Costa', 'ana.costa@email.com', 'São Paulo', 'premium', '2024-01-15'), ('Bruno Ferreira', 'bruno.f@email.com', 'Rio de Janeiro', 'gratuito', '2024-02-20'), ('Carla Mendes', 'carla.m@email.com', 'Belo Horizonte', 'premium', '2024-03-05'), ('Diego Oliveira', 'diego.o@email.com', 'Curitiba', 'gratuito', '2024-03-18'), ('Elisa Rocha', 'elisa.r@email.com', 'São Paulo', 'premium', '2024-04-02'), ('Felipe Santos', 'felipe.s@email.com', 'Recife', 'gratuito', '2024-04-22'), ('Gabriela Lima', 'gabi.lima@email.com', 'Porto Alegre', 'premium', '2024-05-10'), ('Henrique Alves', 'henrique.a@email.com', 'São Paulo', 'gratuito', '2024-06-01'); -- PRODUTOS (10 registros) INSERT INTO produtos (nome, categoria, preco, estoque, marca) VALUES ('Tênis Streetwear X1', 'calçados', 349.90, 45, 'UrbanStep'), ('Moletom Oversized', 'roupas', 189.90, 80, 'CoolWear'), ('Boné Snapback Classic', 'acessórios', 79.90, 120, 'UrbanCap'), ('Calça Jogger Cargo', 'roupas', 219.90, 60, 'StreetFit'), ('Mochila Tática 30L', 'acessórios', 299.90, 35, 'CargoGear'), ('Camiseta Gráfica Fade', 'roupas', 99.90, 150, 'CoolWear'), ('Óculos Retrô Polarizado','acessórios', 159.90, 50, 'VisionUrban'), ('Shorts Tactel Premium', 'roupas', 129.90, 90, 'StreetFit'), ('Tênis Running Lite', 'calçados', 429.90, 30, 'UrbanStep'), ('Carteira Slim Couro', 'acessórios', 89.90, 200, 'LeatherLab'); -- PEDIDOS (12 registros) INSERT INTO pedidos (cliente_id, data_pedido, status, valor_total, canal) VALUES (1, '2025-01-10', 'entregue', 539.80, 'app'), (1, '2025-03-22', 'entregue', 349.90, 'site'), (2, '2025-02-05', 'entregue', 189.90, 'app'), (3, '2025-01-28', 'entregue', 729.70, 'site'), (3, '2025-04-14', 'em_transito',299.90, 'app'), (4, '2025-02-19', 'cancelado', 219.90, 'site'), (5, '2025-03-08', 'entregue', 479.80, 'app'), (5, '2025-04-30', 'pendente', 159.90, 'site'), (6, '2025-03-15', 'entregue', 99.90, 'app'), (7, '2025-04-02', 'entregue', 589.80, 'site'), (7, '2025-05-01', 'em_transito',429.90, 'app'), (8, '2025-05-10', 'pendente', 269.80, 'site'); -- ITENS_PEDIDO (20 registros) INSERT INTO itens_pedido (pedido_id, produto_id, quantidade, preco_unit) VALUES (1, 1, 1, 349.90), (1, 6, 2, 99.90), (2, 9, 1, 429.90), (3, 2, 1, 189.90), (4, 1, 1, 349.90), (4, 4, 1, 219.90), (4, 3, 2, 79.90), (5, 5, 1, 299.90), (6, 4, 1, 219.90), (7, 1, 1, 349.90), (7, 8, 1, 129.90), (8, 7, 1, 159.90), (9, 6, 1, 99.90), (10, 9, 1, 429.90), (10, 3, 2, 79.90), (11, 9, 1, 429.90), (12, 2, 1, 189.90), (12, 8, 1, 129.90);
Observação Importante
Você não precisa executar este SQL em um PostgreSQL real para realizar a atividade. Ele serve como referência da estrutura relacional que você vai converter para JSON. Use-o como input para o prompt de IA da Tarefa 2.
Preparar o
ambiente MongoDB.
Tarefa 1 — 2 pontos
Configure o MongoDB Atlas com um cluster gratuito e crie o banco de dados da UrbanCart. Nenhum cartão de crédito é necessário — o tier M0 é gratuito para sempre.
1
Crie sua conta no MongoDB Atlas
Acesse mongodb.com/cloud/atlas e crie uma conta gratuita. Você pode usar login social com Google.
2
Crie um cluster M0 (gratuito)
No painel, clique em Create → selecione M0 Free → escolha a região mais próxima (ex: São Paulo, AWS) → clique em Create Deployment. Aguarde o cluster ficar disponível (2–3 minutos).
3
Configure o acesso
Crie um usuário de banco com senha (anote!) e adicione seu IP atual à lista de acesso em Network Access. Para facilitar os testes, você pode permitir acesso de qualquer IP (0.0.0.0/0) durante a atividade.
4
Crie o database e a coleção
No cluster, clique em Browse CollectionsAdd My Own Data. Crie:

• Database name: urbancart
• Collection name: pedidos_clientes
Entregável da Tarefa 1
Capture um print de tela mostrando o cluster ativo e a coleção pedidos_clientes criada no database urbancart.
Desnormalizar
é a chave.
Tarefa 2 — 3 pontos
Use IA (Claude, ChatGPT ou similar) para converter o esquema SQL da UrbanCart em documentos JSON desnormalizados, prontos para inserir no MongoDB Atlas via Data Explorer. Em seguida, insira os documentos e confirme a coleção populada.
1
Use o prompt sugerido com a IA
Copie o DDL completo da página anterior e use o prompt abaixo para gerar os documentos JSON.
Prompt sugerido para IA
Converta este esquema SQL do PostgreSQL (tabelas clientes, pedidos, produtos e itens_pedido) em documentos JSON desnormalizados para MongoDB. Cada documento deve representar um PEDIDO completo, incorporando os dados do cliente e os itens com detalhes do produto em arrays embutidos. Adapte para inserção via MongoDB Atlas Data Explorer (JSON estrito: sem comentários, apenas aspas duplas, sem vírgulas finais, sem BOM). Cole o DDL completo aqui: [COLE O SCRIPT SQL DA PÁGINA ANTERIOR]
O que a IA deve gerar — estrutura esperada
Cada documento JSON deve ter esta forma geral (campos exatos podem variar conforme a IA modelar):
Exemplo de documento esperado (estrutura)
{ "pedido_id": 1, "data_pedido": "2025-01-10", "status": "entregue", "canal": "app", "valor_total": 539.80, "cliente": { "cliente_id": 1, "nome": "Ana Beatriz Costa", "email": "ana.costa@email.com", "cidade": "São Paulo", "plano": "premium", "data_cadastro": "2024-01-15" }, "itens": [ { "produto_id": 1, "nome_produto": "Tênis Streetwear X1", "categoria": "calçados", "marca": "UrbanStep", "quantidade": 1, "preco_unit": 349.90, "subtotal": 349.90 }, { "produto_id": 6, "nome_produto": "Camiseta Gráfica Fade", "categoria": "roupas", "marca": "CoolWear", "quantidade": 2, "preco_unit": 99.90, "subtotal": 199.80 } ] }
2
Revise e ajuste o JSON gerado
Certifique-se de que o JSON está em modo estrito (sem comentários, apenas aspas duplas, sem vírgulas finais). Valide com uma ferramenta como jsonlint.com se necessário.
3
Insira no Atlas Data Explorer
No MongoDB Atlas, acesse sua coleção pedidos_clientes → clique em INSERT DOCUMENT → troque para a aba [ ] (array) → cole o array JSON completo → clique em Insert.
Entregável da Tarefa 2
(a) O JSON final que você inseriu (arquivo .json ou texto em PDF) — com os 12 pedidos como documentos.

(b) Print do Atlas Data Explorer mostrando os documentos inseridos na coleção.

(c) Responda brevemente: Quais decisões de modelagem você tomou ao desnormalizar? Por que embutir os itens no pedido, em vez de usar uma coleção separada? (3–5 linhas)
Responder perguntas
de negócio.
Tarefa 3 — 5 pontos
Responda as 6 perguntas abaixo usando filtros MongoDB no Atlas Data Explorer. Para cada pergunta: (1) escreva o filtro JSON usado, (2) copie o resultado retornado, (3) responda a pergunta de negócio em uma frase. Você pode usar IA para ajudar a montar o filtro, mas precisa entender e explicar o que cada operador faz.
Filtro básico — cole no campo Filter da coleção
{ "campo": "valor" } // igual a { "campo": { "$gt": 100 } } // maior que { "campo": { "$in": ["a", "b"] } } // está em lista { "array.subcampo": "valor" } // busca em subdocumento
Nível 1
Q1 — Quais pedidos têm status "entregue"?
Por que importa: A equipe de logística precisa confirmar quais pedidos foram concluídos com sucesso.
Dica: Consulta de igualdade simples no campo status.
Entregue: O filtro usado + quantos documentos retornaram.
Nível 1
Q2 — Quais pedidos foram feitos por clientes da cidade "São Paulo"?
Por que importa: O time regional de SP quer ver todos os pedidos do seu território.
Dica: Use notação de ponto para acessar o campo embutido: "cliente.cidade".
Entregue: O filtro usado + nomes dos clientes retornados.
Nível 2
Q3 — Quais pedidos têm valor total acima de R$ 400,00?
Por que importa: O time financeiro quer segmentar os pedidos de maior ticket para análise de margem.
Dica: Use o operador $gt (greater than) no campo valor_total.
Entregue: O filtro usado + lista dos pedidos retornados com seus valores.
Nível 2
Q4 — Quais pedidos contêm pelo menos um item da categoria "calçados"?
Por que importa: A divisão de calçados quer saber quais pedidos incluem seus produtos para análise de performance.
Dica: Use notação de ponto com arrays embutidos: "itens.categoria". O MongoDB busca dentro de arrays automaticamente.
Entregue: O filtro usado + quantidade de pedidos retornados.
Nível 2
Q5 — Quais pedidos foram feitos pelo canal "app" e têm status "entregue"?
Por que importa: O time de produto mobile quer medir a taxa de conclusão de pedidos do aplicativo.
Dica: Combine dois critérios no mesmo filtro: { "canal": "app", "status": "entregue" } — o MongoDB trata múltiplos campos como AND implícito.
Entregue: O filtro usado + quantidade e lista de pedidos.
Nível 3
Q6 — Quais pedidos de clientes com plano "premium" têm valor total entre R$ 300 e R$ 600?
Por que importa: O time de CRM quer criar uma campanha de upsell para clientes premium com ticket intermediário.
Dica: Combine a busca em subdocumento ("cliente.plano") com operadores de range ($gte e $lte) no valor total.
Entregue: O filtro usado + lista dos pedidos com nome do cliente e valor total.
O que entregar
e como.
Tarefa Entregável Pontos
Tarefa 1 — Configuração Atlas Print do cluster + coleção criada 2,0
Tarefa 2 — Conversão SQL → JSON JSON inserido + print + resposta de modelagem 3,0
Tarefa 3 — Consultas (Q1–Q6) Filtro + resultado + resposta de negócio por questão 5,0
Total 10,0
Documento único (PDF)
Entregue um único documento organizado em três seções (uma por tarefa), contendo:

Tarefa 1: Print de tela do cluster e da coleção no Atlas.

Tarefa 2: O array JSON completo inserido (pode ser como bloco de código) + print do Data Explorer + resposta de 3–5 linhas sobre as decisões de modelagem.

Tarefa 3: Para cada questão (Q1 a Q6): o filtro JSON usado, print ou cópia dos resultados retornados, e uma frase respondendo a pergunta de negócio.
Uso de IA — Política
Você pode e deve usar IA para gerar o JSON da Tarefa 2 e para ajudar a montar os filtros da Tarefa 3. O que será avaliado é sua capacidade de entender, adaptar e explicar o que foi gerado — não a capacidade de escrever JSON de memória. Se usar IA, indique quais partes foram geradas com ajuda e o que você modificou.
Reflexão Final — Inclua no documento
Ao final do documento, escreva um parágrafo (5–8 linhas) respondendo: "Para a UrbanCart, que tipo de pergunta faz mais sentido responder no MongoDB e que tipo faz mais sentido no PostgreSQL? Com base na sua experiência com esta atividade, quando você escolheria um e quando escolheria o outro?"