Nivel 1 · 20 min
CRUD e Índices
Los índices de MongoDB son la herramienta principal para la performance de queries. Entender los tipos de índice, la regla ESR para el diseño de índices compuestos y cómo verificar el uso de índices con explain() es esencial para operaciones de MongoDB en producción.
Tipos de Índice
Los índices single-field indexan un campo en orden ascendente (1) o descendente (-1). Los índices compuestos indexan múltiples campos: el orden importa para la cobertura de queries y el soporte de ordenamiento. Los índices parciales indexan solo documentos que coincidan con una expresión de filtro. Los índices TTL (expireAfterSeconds) eliminan automáticamente documentos después de un período de tiempo. Los índices text soportan búsqueda full-text $text. Los índices multikey manejan automáticamente campos array: MongoDB crea una entrada de índice por elemento del array.
Regla ESR para Índices Compuestos
La regla ESR (Equality-Sort-Range) define el orden óptimo de campos en un índice compuesto. Campos de Equality primero: los campos usados con operadores de match exacto ($eq, $in) deben aparecer primero — filtran la mayoría de documentos rápidamente. Campos de Sort segundo: los campos usados en sort aparecen después — el índice puede satisfacer el sort sin un sort en memoria. Campos de Range al final: los campos usados con $gt, $lt, $gte, $lte aparecen al final. Ejemplo: query filtra status=''active'', ordena por createdAt DESC, rango en price: índice es (status, createdAt, price).
Selectividad de Índices y Covered Queries
La selectividad mide cuántos documentos elimina una clave de índice. Alta selectividad: un campo email donde cada valor es único. Baja selectividad: un campo booleano donde la mitad de los documentos tiene cada valor. Una covered query devuelve todos los datos requeridos solo desde el índice, sin fetch de documentos. Esto requiere que todos los campos proyectados estén en el índice. Ejemplo: índice en (status, email) y query proyecta solo status y email — MongoDB nunca lee el documento, solo el índice.
Code example
// ESR compound index: status (E), createdAt (S), price (R)\ndb.orders.createIndex(\n {status: 1, createdAt: -1, price: 1},\n {name: 'idx_orders_esr}\n)\n\n// Partial index: only active orders\ndb.orders.createIndex(\n {customerId: 1},\n {partialFilterExpression: {status: 'active}'}'\n)\n\n// TTL index: auto-delete sessions after 1 hour\ndb.sessions.createIndex(\n {createdAt: 1},\n {expireAfterSeconds: 3600}'\n)