Design de Esquema de Pedido MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como projetar um schema MongoDB para uma aplicação de e-commerce. O objetivo é criar um único documento abrangente para cada pedido, que seja fácil de gerenciar e consultar. Você começará criando uma estrutura básica de pedido, depois a enriquecerá progressivamente incorporando informações detalhadas do cliente, uma lista de itens encomendados, detalhes de pagamento e um histórico de status. Essa abordagem demonstra o poder do modelo de documentos do MongoDB para aplicações do mundo real.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 100%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Criar um Documento de Pedido Básico

Nesta primeira etapa, você se conectará ao MongoDB e criará um novo banco de dados. Em seguida, inserirá seu primeiro documento de pedido, que servirá como base para o schema que construiremos nas etapas seguintes.

Primeiro, abra o MongoDB Shell. Esta interface interativa de linha de comando permite que você se comunique com seu banco de dados MongoDB.

mongosh

Uma vez dentro do shell, você verá um prompt >. Agora, mude para um novo banco de dados chamado ecommerce. Se o banco de dados não existir, o MongoDB o criará para você quando você armazenar dados pela primeira vez.

use ecommerce

Em seguida, você criará uma coleção chamada orders inserindo um documento nela. Este documento representará um único pedido e conterá informações essenciais como um ID de pedido, detalhes do cliente, a data do pedido e seu status atual.

Execute o seguinte comando para inserir o documento:

db.orders.insertOne({
  order_id: "ORD001",
  order_date: new Date("2023-10-26T10:00:00Z"),
  customer_id: "CUST123",
  status: "pending",
  total: 150.0
});

Este comando executa as seguintes ações:

  • db.orders: Especifica a coleção orders dentro do banco de dados atual.
  • insertOne(): Um método do MongoDB para inserir um único documento.
  • O próprio documento é um objeto semelhante a JSON com pares chave-valor para order_id, order_date, customer_id, status e total.

Após a inserção bem-sucedida, o MongoDB retornará um reconhecimento juntamente com o _id exclusivo do documento recém-criado.

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

Você agora criou a estrutura básica para um pedido. Na próxima etapa, você aprimorará este documento com informações mais detalhadas.

Aprimorar com Detalhes do Cliente Embutidos

Um simples customer_id muitas vezes não é suficiente. Em uma aplicação real, você frequentemente precisaria do nome e endereço do cliente ao recuperar um pedido. Em vez de realizar uma consulta separada a uma coleção customers, podemos incorporar essas informações diretamente no documento do pedido. Este é um padrão comum e poderoso no MongoDB que melhora o desempenho de leitura.

Nesta etapa, você atualizará o documento do pedido para incluir informações detalhadas e aninhadas do cliente. Se você saiu do shell mongosh na etapa anterior, por favor, inicie-o novamente e execute use ecommerce.

Use o método updateOne() para encontrar o documento com order_id: "ORD001" e modificá-lo. O operador $set substitui o valor de um campo pelo valor especificado, e $unset remove um campo completamente.

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $set: {
      customer: {
        customer_id: "CUST123",
        first_name: "John",
        last_name: "Doe",
        email: "john.doe@example.com",
        shipping_address: {
          street: "123 Main St",
          city: "Anytown",
          state: "CA",
          zip_code: "12345"
        }
      }
    },
    $unset: {
      customer_id: ""
    }
  }
);

Neste comando:

  • O primeiro argumento { order_id: "ORD001" } é o filtro para selecionar o documento a ser atualizado.
  • O segundo argumento contém os operadores de atualização:
    • $set: Estamos definindo um novo campo customer, que é um documento embutido contendo informações detalhadas.
    • $unset: Estamos removendo o antigo campo customer_id de nível superior para evitar redundância de dados.

Para verificar suas alterações, você pode recuperar o documento atualizado usando findOne():

db.orders.findOne({ order_id: "ORD001" });

A saída agora mostrará o documento customer aninhado, e o campo customer_id de nível superior terá desaparecido. Essa estrutura embutida mantém dados relacionados juntos em um único documento.

Adicionar um Array de Itens do Pedido

Um pedido normalmente consiste em um ou mais produtos. A melhor maneira de modelar essa relação de um para muitos dentro de um único documento de pedido é usar um array de documentos embutidos. Cada elemento no array representará um item no pedido.

Vamos atualizar nosso documento de pedido para incluir uma lista de itens. Adicionaremos um campo items, que será um array. Cada objeto no array conterá detalhes sobre um produto, como seu ID, nome, preço e quantidade.

Execute o seguinte comando updateOne:

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $set: {
      items: [
        {
          product_id: "PROD01",
          name: "Laptop",
          price: 1200.0,
          quantity: 1
        },
        {
          product_id: "PROD02",
          name: "Mouse",
          price: 25.0,
          quantity: 1
        }
      ],
      total: 1225.0
    }
  }
);

Aqui, usamos $set novamente para adicionar o array items. Também atualizamos o campo total para corresponder à soma dos preços dos itens. Armazenar o total calculado diretamente no documento é outra otimização de desempenho, pois evita a necessidade de agregação em cada leitura.

Vamos verificar o documento novamente para ver o novo array items.

db.orders.findOne({ order_id: "ORD001" });

Você verá o array items embutido dentro do documento do pedido. Este design permite que você recupere um pedido completo, incluindo todos os seus itens, com uma única consulta ao banco de dados.

Embutir Informações de Pagamento

Os detalhes de pagamento são outra parte crítica de um pedido. Semelhante às informações do cliente e aos itens, os dados de pagamento podem ser incorporados diretamente no documento do pedido. Isso inclui o método de pagamento, ID da transação e status.

Nesta etapa, você adicionará um subdocumento payment ao pedido.

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $set: {
      payment: {
        method: "credit_card",
        transaction_id: "TXN54321",
        status: "completed"
      }
    }
  }
);

Este comando adiciona um objeto payment com três campos: method, transaction_id e status. Incorporar essas informações garante que todos os dados relacionados a uma única transação estejam localizados em um só lugar.

Vamos visualizar a estrutura do nosso documento de pedido agora.

db.orders.findOne({ order_id: "ORD001" });

O documento agora contém informações abrangentes sobre o pedido, cliente, itens e pagamento, todos acessíveis por meio de uma única operação de leitura.

Rastrear Histórico de Status do Pedido

Um pedido progride através de vários estágios, como "pendente", "processando", "enviado" e "entregue". Enquanto o campo de nível superior status mostra o estado atual, é frequentemente útil manter um registro de todas as alterações de status. Você pode conseguir isso adicionando um array status_history.

Nesta etapa final, você atualizará o status do pedido para "processando" e começará a construir o array status_history. O operador $push é usado para anexar um valor a um array.

Primeiro, vamos adicionar o status inicial "pendente" ao histórico e atualizar o status atual para "processando".

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $set: { status: "processing" },
    $push: {
      status_history: {
        status: "pending",
        timestamp: new Date("2023-10-26T10:00:00Z")
      }
    }
  }
);

Agora, vamos adicionar o novo status "processando" ao histórico para manter o registro completo.

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $push: {
      status_history: {
        status: "processing",
        timestamp: new Date("2023-10-26T11:30:00Z")
      }
    }
  }
);

Essa abordagem fornece um rastro de auditoria completo do ciclo de vida do pedido. Você pode consultar o documento para ver seu histórico completo a qualquer momento.

db.orders.findOne({ order_id: "ORD001" });

O documento agora inclui um array status_history, dando a você uma visão completa da jornada do pedido. Para sair do shell do MongoDB, digite exit e pressione Enter.

Resumo

Neste laboratório, você aprendeu como projetar um esquema MongoDB prático e eficiente para um pedido de e-commerce. Você começou com um documento básico e o enriqueceu progressivamente incorporando dados relacionados. Você criou com sucesso um único documento que contém detalhes do cliente, um array de itens do pedido, informações de pagamento e um histórico completo de status. Este padrão de documento incorporado é um conceito central no design de esquemas MongoDB que ajuda a criar aplicações performáticas e escaláveis, reduzindo a necessidade de joins complexos e múltiplas consultas.