En este tema, aprenderemos a construir una aplicación de comercio electrónico utilizando MongoDB. Este tipo de aplicación es un excelente ejemplo para entender cómo manejar datos complejos y realizar operaciones avanzadas en MongoDB. Cubriremos desde el diseño del esquema hasta la implementación de operaciones CRUD y características avanzadas como la búsqueda y la agregación.

Objetivos del Tema

  • Diseñar un esquema de base de datos para una aplicación de comercio electrónico.
  • Implementar operaciones CRUD para productos, usuarios y pedidos.
  • Utilizar índices y agregaciones para mejorar el rendimiento y la funcionalidad.
  • Integrar MongoDB con una aplicación web.

  1. Diseño del Esquema

1.1. Colección de Productos

Cada producto en nuestra tienda tendrá varios atributos como nombre, descripción, precio, categoría, y stock.

{
  "_id": ObjectId("..."),
  "name": "Camiseta",
  "description": "Camiseta de algodón 100%",
  "price": 19.99,
  "category": "Ropa",
  "stock": 100,
  "created_at": ISODate("2023-10-01T00:00:00Z"),
  "updated_at": ISODate("2023-10-01T00:00:00Z")
}

1.2. Colección de Usuarios

Los usuarios tendrán información básica como nombre, correo electrónico, y una lista de direcciones.

{
  "_id": ObjectId("..."),
  "name": "Juan Pérez",
  "email": "[email protected]",
  "addresses": [
    {
      "street": "Calle Falsa 123",
      "city": "Ciudad",
      "state": "Estado",
      "zip": "12345"
    }
  ],
  "created_at": ISODate("2023-10-01T00:00:00Z"),
  "updated_at": ISODate("2023-10-01T00:00:00Z")
}

1.3. Colección de Pedidos

Cada pedido contendrá información sobre el usuario, los productos comprados, y el estado del pedido.

{
  "_id": ObjectId("..."),
  "user_id": ObjectId("..."),
  "products": [
    {
      "product_id": ObjectId("..."),
      "quantity": 2,
      "price": 19.99
    }
  ],
  "total": 39.98,
  "status": "Pendiente",
  "created_at": ISODate("2023-10-01T00:00:00Z"),
  "updated_at": ISODate("2023-10-01T00:00:00Z")
}

  1. Operaciones CRUD

2.1. Creando Productos

Para crear un nuevo producto, utilizamos la operación insertOne.

db.products.insertOne({
  "name": "Camiseta",
  "description": "Camiseta de algodón 100%",
  "price": 19.99,
  "category": "Ropa",
  "stock": 100,
  "created_at": new Date(),
  "updated_at": new Date()
});

2.2. Leyendo Productos

Para leer productos, podemos utilizar la operación find.

db.products.find({ "category": "Ropa" });

2.3. Actualizando Productos

Para actualizar un producto, utilizamos la operación updateOne.

db.products.updateOne(
  { "_id": ObjectId("...") },
  { $set: { "price": 24.99, "updated_at": new Date() } }
);

2.4. Eliminando Productos

Para eliminar un producto, utilizamos la operación deleteOne.

db.products.deleteOne({ "_id": ObjectId("...") });

  1. Índices y Agregaciones

3.1. Creando Índices

Para mejorar el rendimiento de las consultas, podemos crear índices en los campos más consultados.

db.products.createIndex({ "category": 1 });

3.2. Usando Agregaciones

Las agregaciones nos permiten realizar operaciones complejas como cálculos y transformaciones de datos.

db.orders.aggregate([
  { $match: { "status": "Completado" } },
  { $group: { _id: "$user_id", totalSpent: { $sum: "$total" } } }
]);

  1. Integración con una Aplicación Web

4.1. Configuración del Servidor

Utilizaremos Node.js y Express para crear una API REST que interactúe con nuestra base de datos MongoDB.

const express = require('express');
const mongoose = require('mongoose');

const app = express();
app.use(express.json());

mongoose.connect('mongodb://localhost:27017/ecommerce', { useNewUrlParser: true, useUnifiedTopology: true });

const productSchema = new mongoose.Schema({
  name: String,
  description: String,
  price: Number,
  category: String,
  stock: Number,
  created_at: Date,
  updated_at: Date
});

const Product = mongoose.model('Product', productSchema);

app.post('/products', async (req, res) => {
  const product = new Product(req.body);
  await product.save();
  res.send(product);
});

app.get('/products', async (req, res) => {
  const products = await Product.find();
  res.send(products);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

4.2. Operaciones CRUD en la API

Ya hemos implementado las operaciones de creación y lectura. De manera similar, podemos implementar las operaciones de actualización y eliminación.

app.put('/products/:id', async (req, res) => {
  const product = await Product.findByIdAndUpdate(req.params.id, req.body, { new: true });
  res.send(product);
});

app.delete('/products/:id', async (req, res) => {
  await Product.findByIdAndDelete(req.params.id);
  res.send({ message: 'Product deleted' });
});

Ejercicio Práctico

Ejercicio

  1. Diseña una colección para almacenar reseñas de productos. Cada reseña debe contener el ID del producto, el ID del usuario, una calificación y un comentario.
  2. Implementa las operaciones CRUD para la colección de reseñas.
  3. Crea un índice en el campo product_id de la colección de reseñas.
  4. Utiliza una agregación para calcular la calificación promedio de un producto.

Solución

1. Diseño de la Colección de Reseñas

{
  "_id": ObjectId("..."),
  "product_id": ObjectId("..."),
  "user_id": ObjectId("..."),
  "rating": 4.5,
  "comment": "Excelente producto",
  "created_at": ISODate("2023-10-01T00:00:00Z"),
  "updated_at": ISODate("2023-10-01T00:00:00Z")
}

2. Operaciones CRUD

// Creando una reseña
db.reviews.insertOne({
  "product_id": ObjectId("..."),
  "user_id": ObjectId("..."),
  "rating": 4.5,
  "comment": "Excelente producto",
  "created_at": new Date(),
  "updated_at": new Date()
});

// Leyendo reseñas
db.reviews.find({ "product_id": ObjectId("...") });

// Actualizando una reseña
db.reviews.updateOne(
  { "_id": ObjectId("...") },
  { $set: { "rating": 5, "updated_at": new Date() } }
);

// Eliminando una reseña
db.reviews.deleteOne({ "_id": ObjectId("...") });

3. Creando un Índice

db.reviews.createIndex({ "product_id": 1 });

4. Agregación para Calcular la Calificación Promedio

db.reviews.aggregate([
  { $match: { "product_id": ObjectId("...") } },
  { $group: { _id: "$product_id", averageRating: { $avg: "$rating" } } }
]);

Conclusión

En este tema, hemos aprendido a diseñar y construir una aplicación de comercio electrónico utilizando MongoDB. Hemos cubierto desde el diseño del esquema hasta la implementación de operaciones CRUD y características avanzadas como índices y agregaciones. Además, hemos integrado MongoDB con una aplicación web utilizando Node.js y Express. Con estos conocimientos, estás preparado para construir aplicaciones complejas y eficientes utilizando MongoDB.

© Copyright 2024. Todos los derechos reservados