Node.js y ExpressBases de Datos y APIsLección 12 de 20
Mongoose y MongoDB
Mongoose es el ODM (Object Document Mapper) más popular para MongoDB en Node.js. Agrega schemas, validación, middleware (hooks) y métodos de consulta encadenables sobre el driver nativo de MongoDB. Es ideal cuando necesitas flexibilidad de esquema con algo de estructura.
// npm install mongoose
const mongoose = require('mongoose');
// Conectar a MongoDB
mongoose.connect(process.env.MONGODB_URI)
.then(() => console.log('MongoDB conectado'))
.catch(err => { console.error(err); process.exit(1); });
// Definir Schema
const usuarioSchema = new mongoose.Schema({
nombre: { type: String, required: true, trim: true },
email: { type: String, required: true, unique: true, lowercase: true },
password: { type: String, required: true, select: false }, // no incluir en queries por defecto
rol: { type: String, enum: ['admin', 'usuario'], default: 'usuario' },
activo: { type: Boolean, default: true },
perfil: {
bio: String,
avatar: String,
},
}, {
timestamps: true, // agrega createdAt y updatedAt automáticamente
});
// Índices para queries frecuentes
usuarioSchema.index({ email: 1 }); // ya existe por unique, pero es explícito
usuarioSchema.index({ rol: 1, activo: 1 }); // índice compuesto
// Método de instancia
usuarioSchema.methods.toPublicJSON = function() {
return { id: this._id, nombre: this.nombre, email: this.email };
};
const Usuario = mongoose.model('Usuario', usuarioSchema);
// CRUD
async function ejemplos() {
// Crear
const usuario = await Usuario.create({ nombre: 'Ana', email: 'ana@test.com', password: 'hash' });
// Buscar con populate (referencia a otro documento)
const conTareas = await Usuario.findById(usuario._id)
.populate('tareas', 'titulo completada') // solo esos campos
.lean(); // devuelve plain object, 2x más rápido, no tiene métodos
// Query encadenada
const activos = await Usuario.find({ activo: true, rol: 'usuario' })
.select('nombre email -password') // incluir/excluir campos
.sort({ createdAt: -1 })
.limit(20)
.skip(0)
.lean();
// Actualizar
await Usuario.findByIdAndUpdate(usuario._id,
{ $set: { nombre: 'Ana García' } },
{ new: true } // devolver documento actualizado
);
// Eliminar
await Usuario.findByIdAndDelete(usuario._id);
}
ConsejoUsa .lean() al final de queries de solo lectura. lean() devuelve plain JavaScript objects en vez de documentos Mongoose con toda la lógica de ODM. Es 2-3 veces más rápido y usa menos memoria.
Practica esta lección
Resuelve los ejercicios del curso de Node.js y Express en la app, gratis y con corrección automática.
Empezar a practicar