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.
- 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") }
- 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
.
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
.
- Índices y Agregaciones
3.1. Creando Índices
Para mejorar el rendimiento de las consultas, podemos crear índices en los campos más consultados.
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" } } } ]);
- 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
- 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.
- Implementa las operaciones CRUD para la colección de reseñas.
- Crea un índice en el campo
product_id
de la colección de reseñas. - 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
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.
Curso de MongoDB
Módulo 1: Introducción a MongoDB
Módulo 2: Operaciones CRUD en MongoDB
Módulo 3: Modelado de Datos en MongoDB
Módulo 4: Indexación y Agregación
Módulo 5: Características Avanzadas de MongoDB
Módulo 6: Rendimiento y Seguridad
- Optimización del Rendimiento
- Respaldo y Restauración
- Mejores Prácticas de Seguridad
- Monitoreo y Alertas