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