Inicio > Cursos > Node.js y Express > Mongoose y MongoDB
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.
← Prisma ORMAPI REST Completa →

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