Diseñar Esquema de Pedidos en MongoDB

MongoDBBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a diseñar un esquema de MongoDB para una aplicación de comercio electrónico. El objetivo es crear un único documento completo para cada pedido que sea fácil de gestionar y consultar. Comenzará creando una estructura de pedido básica, luego la enriquecerá progresivamente incrustando información detallada del cliente, una lista de artículos pedidos, detalles de pago y un historial de estado. Este enfoque demuestra el poder del modelo de documentos de MongoDB para aplicaciones del mundo real.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 100%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Crear un Documento de Pedido Básico

En este primer paso, se conectará a MongoDB y creará una nueva base de datos. Luego, insertará su primer documento de pedido, que servirá como base para el esquema que construiremos en los siguientes pasos.

Primero, abra la Shell de MongoDB (MongoDB Shell). Esta interfaz interactiva de línea de comandos le permite comunicarse con su base de datos MongoDB.

mongosh

Una vez dentro de la shell, verá un prompt >. Ahora, cambie a una nueva base de datos llamada ecommerce. Si la base de datos no existe, MongoDB la creará por usted cuando almacene datos por primera vez.

use ecommerce

A continuación, creará una colección llamada orders insertando un documento en ella. Este documento representará un único pedido y contendrá información esencial como un ID de pedido, detalles del cliente, la fecha del pedido y su estado actual.

Ejecute el siguiente comando para insertar el 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 realiza las siguientes acciones:

  • db.orders: Especifica la colección orders dentro de la base de datos actual.
  • insertOne(): Un método de MongoDB para insertar un único documento.
  • El documento en sí es un objeto similar a JSON con pares clave-valor para order_id, order_date, customer_id, status y total.

Después de una inserción exitosa, MongoDB devolverá un acuse de recibo junto con el _id único del documento recién creado.

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

Ahora ha creado la estructura básica para un pedido. En el siguiente paso, mejorará este documento con información más detallada.

Mejorar con Detalles del Cliente Incrustados

Un simple customer_id a menudo no es suficiente. En una aplicación real, necesitaría frecuentemente el nombre y la dirección del cliente al recuperar un pedido. En lugar de realizar una consulta separada a una colección customers, podemos incrustar esta información directamente dentro del documento del pedido. Este es un patrón común y potente en MongoDB que mejora el rendimiento de lectura.

En este paso, actualizará el documento del pedido para incluir información detallada y anidada del cliente. Si salió de la shell mongosh en el paso anterior, por favor, iníciela de nuevo y ejecute use ecommerce.

Utilice el método updateOne() para encontrar el documento con order_id: "ORD001" y modificarlo. El operador $set reemplaza el valor de un campo con el valor especificado, y $unset elimina un campo por completo.

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: ""
    }
  }
);

En este comando:

  • El primer argumento { order_id: "ORD001" } es el filtro para seleccionar el documento a actualizar.
  • El segundo argumento contiene los operadores de actualización:
    • $set: Estamos estableciendo un nuevo campo customer que es un documento anidado que contiene información detallada.
    • $unset: Estamos eliminando el antiguo campo customer_id de nivel superior para evitar la redundancia de datos.

Para verificar sus cambios, puede recuperar el documento actualizado usando findOne():

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

La salida ahora mostrará el documento customer anidado, y el campo customer_id de nivel superior habrá desaparecido. Esta estructura incrustada mantiene los datos relacionados juntos en un solo documento.

Añadir un Array de Artículos del Pedido

Un pedido normalmente consta de uno o más productos. La mejor manera de modelar esta relación uno a muchos dentro de un único documento de pedido es usar un array de documentos incrustados. Cada elemento en el array representará un artículo en el pedido.

Actualicemos nuestro documento de pedido para incluir una lista de artículos. Añadiremos un campo items, que será un array. Cada objeto en el array contendrá detalles sobre un producto, como su ID, nombre, precio y cantidad.

Ejecute el siguiente 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
    }
  }
);

Aquí, usamos $set nuevamente para añadir el array items. También actualizamos el campo total para que coincida con la suma de los precios de los artículos. Almacenar el total calculado directamente en el documento es otra optimización de rendimiento, ya que evita la necesidad de agregación en cada lectura.

Verifiquemos el documento nuevamente para ver el nuevo array items.

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

Verá el array items incrustado dentro del documento del pedido. Este diseño le permite recuperar un pedido completo, incluyendo todos sus artículos, con una única consulta a la base de datos.

Incrustar Información de Pago

Los detalles de pago son otra parte crítica de un pedido. Similar a la información del cliente y los artículos, los datos de pago se pueden incrustar directamente en el documento del pedido. Esto incluye el método de pago, el ID de la transacción y el estado.

En este paso, añadirá un sub-documento payment al pedido.

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

Este comando añade un objeto payment con tres campos: method, transaction_id y status. Incrustar esta información asegura que todos los datos relacionados con una única transacción se encuentren en un solo lugar.

Veamos la estructura de nuestro documento de pedido ahora.

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

El documento ahora contiene información completa sobre el pedido, el cliente, los artículos y el pago, todo accesible a través de una única operación de lectura.

Seguimiento del Historial de Estado del Pedido

Un pedido progresa a través de varias etapas, como "pendiente", "procesando", "enviado" y "entregado". Si bien el campo de nivel superior status muestra el estado actual, a menudo es útil mantener un registro de todos los cambios de estado. Puede lograr esto añadiendo un array status_history.

En este paso final, actualizará el estado del pedido a "procesando" y comenzará a construir el array status_history. El operador $push se utiliza para añadir un valor a un array.

Primero, añadamos el estado inicial "pendiente" al historial y actualicemos el estado actual a "procesando".

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

Ahora, añadamos el nuevo estado "procesando" al historial para mantener el registro completo.

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

Este enfoque proporciona un registro de auditoría completo del ciclo de vida del pedido. Puede consultar el documento para ver su historial completo en cualquier momento.

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

El documento ahora incluye un array status_history, lo que le proporciona una visión completa del recorrido del pedido. Para salir de la shell de MongoDB, escriba exit y presione Enter.

Resumen

En este laboratorio, ha aprendido a diseñar un esquema de MongoDB práctico y eficiente para un pedido de comercio electrónico. Comenzó con un documento básico y lo enriqueció progresivamente incrustando datos relacionados. Ha creado con éxito un único documento que contiene los detalles del cliente, un array de artículos del pedido, información de pago y un historial de estado completo. Este patrón de documento incrustado es un concepto central en el diseño de esquemas de MongoDB que ayuda a crear aplicaciones de alto rendimiento y escalables al reducir la necesidad de uniones complejas y múltiples consultas.