Introducción
En este tema, aprenderemos a usar MongoDB, una base de datos NoSQL, junto con Mongoose, una biblioteca de modelado de datos para MongoDB y Node.js. Mongoose proporciona una solución sencilla y elegante para trabajar con datos en MongoDB, permitiendo definir esquemas y modelos que facilitan la validación y la manipulación de datos.
Contenido
Instalación de MongoDB y Mongoose
Instalación de MongoDB
Para instalar MongoDB, sigue las instrucciones específicas para tu sistema operativo en la documentación oficial de MongoDB.
Instalación de Mongoose
Para instalar Mongoose en tu proyecto Node.js, usa el siguiente comando:
Conexión a MongoDB
Para conectarte a una base de datos MongoDB usando Mongoose, primero necesitas importar Mongoose y luego usar el método connect
para establecer la conexión.
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/miBaseDeDatos', { useNewUrlParser: true, useUnifiedTopology: true }).then(() => { console.log('Conectado a MongoDB'); }).catch((error) => { console.error('Error al conectar a MongoDB:', error); });
Definición de Esquemas y Modelos
Esquema
Un esquema en Mongoose define la estructura de los documentos dentro de una colección. Aquí hay un ejemplo de cómo definir un esquema para una colección de usuarios:
const { Schema } = mongoose; const usuarioSchema = new Schema({ nombre: { type: String, required: true }, edad: { type: Number, required: true }, email: { type: String, required: true, unique: true }, fechaCreacion: { type: Date, default: Date.now } });
Modelo
Un modelo en Mongoose es una clase que se crea a partir de un esquema y se utiliza para interactuar con la base de datos.
Operaciones CRUD
Crear
Para crear un nuevo documento en la base de datos, usa el método save
del modelo.
const nuevoUsuario = new Usuario({ nombre: 'Juan Pérez', edad: 30, email: '[email protected]' }); nuevoUsuario.save().then((usuario) => { console.log('Usuario creado:', usuario); }).catch((error) => { console.error('Error al crear usuario:', error); });
Leer
Para leer documentos de la base de datos, usa el método find
del modelo.
Usuario.find().then((usuarios) => { console.log('Usuarios:', usuarios); }).catch((error) => { console.error('Error al leer usuarios:', error); });
Actualizar
Para actualizar un documento, usa el método findByIdAndUpdate
.
Usuario.findByIdAndUpdate('idDelUsuario', { edad: 31 }, { new: true }).then((usuario) => { console.log('Usuario actualizado:', usuario); }).catch((error) => { console.error('Error al actualizar usuario:', error); });
Eliminar
Para eliminar un documento, usa el método findByIdAndDelete
.
Usuario.findByIdAndDelete('idDelUsuario').then((usuario) => { console.log('Usuario eliminado:', usuario); }).catch((error) => { console.error('Error al eliminar usuario:', error); });
Validación y Middleware
Validación
Mongoose permite definir validaciones en los esquemas. Por ejemplo, podemos asegurarnos de que el campo email
tenga un formato válido.
const usuarioSchema = new Schema({ nombre: { type: String, required: true }, edad: { type: Number, required: true }, email: { type: String, required: true, unique: true, match: /.+\@.+\..+/ }, fechaCreacion: { type: Date, default: Date.now } });
Middleware
Mongoose también permite definir middleware que se ejecuta en diferentes etapas del ciclo de vida de un documento. Por ejemplo, podemos definir un middleware pre-save
para realizar alguna acción antes de guardar un documento.
usuarioSchema.pre('save', function(next) { console.log('Antes de guardar el usuario:', this); next(); });
Ejercicios Prácticos
Ejercicio 1: Crear y Leer Usuarios
-
Crea un nuevo usuario con los siguientes datos:
- Nombre: Ana Gómez
- Edad: 25
- Email: [email protected]
-
Lee todos los usuarios de la base de datos y muestra los resultados en la consola.
Solución
const nuevoUsuario = new Usuario({ nombre: 'Ana Gómez', edad: 25, email: '[email protected]' }); nuevoUsuario.save().then((usuario) => { console.log('Usuario creado:', usuario); return Usuario.find(); }).then((usuarios) => { console.log('Usuarios:', usuarios); }).catch((error) => { console.error('Error:', error); });
Ejercicio 2: Actualizar y Eliminar Usuarios
- Actualiza la edad del usuario con el email
[email protected]
a 26. - Elimina el usuario con el email
[email protected]
.
Solución
Usuario.findOneAndUpdate({ email: '[email protected]' }, { edad: 26 }, { new: true }).then((usuario) => { console.log('Usuario actualizado:', usuario); return Usuario.findOneAndDelete({ email: '[email protected]' }); }).then((usuario) => { console.log('Usuario eliminado:', usuario); }).catch((error) => { console.error('Error:', error); });
Conclusión
En este tema, hemos aprendido a usar MongoDB con Mongoose en una aplicación Node.js. Hemos cubierto la instalación, conexión, definición de esquemas y modelos, y operaciones CRUD básicas. También hemos visto cómo realizar validaciones y usar middleware en Mongoose. Con estos conocimientos, estás preparado para manejar datos en MongoDB de manera eficiente y estructurada en tus aplicaciones Node.js.
Curso de Node.js
Módulo 1: Introducción a Node.js
Módulo 2: Conceptos Básicos
Módulo 3: Sistema de Archivos y E/S
Módulo 4: HTTP y Servidores Web
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos