Volver a MongoDB Básico
Índices en MongoDB
Fundamentos de Índices
// Índice de campo simple
db.usuarios.createIndex({ email: 1 }) // ascendente
db.productos.createIndex({ precio: -1 }) // descendente
// Índice único
db.usuarios.createIndex({ email: 1 }, { unique: true })
// Índice sparse (solo indexa docs donde el campo existe)
db.usuarios.createIndex({ telefono: 1 }, { sparse: true })
// Índice TTL (eliminar docs automáticamente después de N segundos)
db.sesiones.createIndex({ creado_en: 1 }, { expireAfterSeconds: 3600 })
// Listar índices
db.usuarios.getIndexes()
// Eliminar índice
db.usuarios.dropIndex("email_1")
Índices Compuestos
// Regla ESR: Igualdad, Orden, Rango
db.pedidos.createIndex({ clienteId: 1, estado: 1, creado_en: -1 })
// Esta consulta usa el índice eficientemente:
db.pedidos.find({ clienteId: "...", estado: "activo" })
.sort({ creado_en: -1 })
// Consulta cubierta: todo en el índice, sin acceder al documento
db.pedidos.createIndex({ clienteId: 1, total: 1 })
db.pedidos.find(
{ clienteId: "..." },
{ total: 1, _id: 0 }
)
explain() — Analizar Planes de Consulta
db.pedidos.find({ clienteId: "123", estado: "activo" })
.explain("executionStats")
// Campos clave:
// - winningPlan.stage: IXSCAN (bueno) vs COLLSCAN (malo)
// - totalDocsExamined vs nReturned (ratio ~1 es ideal)
// - executionTimeMillis
Índices de Texto
db.articulos.createIndex(
{ titulo: "text", cuerpo: "text", etiquetas: "text" },
{ weights: { titulo: 10, etiquetas: 5, cuerpo: 1 } }
)
db.articulos.find({ $text: { $search: "mongodb agregación" } })
// Excluir palabra
db.articulos.find({ $text: { $search: "mongodb -sql" } })
Índices Parciales
// Solo indexar productos activos
db.productos.createIndex(
{ precio: 1 },
{ partialFilterExpression: { estado: "activo" } }
)
// Debe incluirse la condición del filtro para usar el índice
db.productos.find({ estado: "activo", precio: { $lt: 100 } })
Índices Wildcard
// Indexar todos los campos de un subdocumento
db.productos.createIndex({ "atributos.$**": 1 })
// Cualquier campo de atributos puede consultarse con índice
db.productos.find({ "atributos.color": "rojo" })
db.productos.find({ "atributos.peso": { $lt: 2 } })
Estrategias de Indexación
// 1. No crear demasiados índices (penalizan escrituras)
// 2. Crear índices en segundo plano
db.coleccionGrande.createIndex({ campo: 1 }, { background: true })
// 3. Monitorear uso de índices
db.pedidos.aggregate([{ $indexStats: {} }])
// 'accesses.ops' = 0 → índice sin usar, candidato a eliminación