Bases de datos nosql

1. ¿Qué son los índices y por qué son importantes?

Un índice en una base de datos es como el índice de un libro 📖:

  • Sin índice 📕: Para encontrar un tema, debes leer todas las páginas hasta encontrarlo.
  • Con índice 📖: Buscas en la lista de temas y vas directo a la página correcta.

👉 En bases documentales, los índices aceleran la búsqueda de datos, evitando que la base de datos tenga que revisar todos los documentos.

📌 Ejemplo sin índice:

1db.productos.find({ nombre: "Laptop" })

Si hay 1 millón de productos, MongoDB revisará todos los documentos para encontrar las coincidencias. Esto es muy lento.

📌 Ejemplo con índice:

1db.productos.createIndex({ nombre: 1 })

Ahora, cuando buscamos "Laptop", MongoDB usa el índice y encuentra el dato rápidamente ✅.


2. Crear un Índice en MongoDB

Podemos crear índices en cualquier campo con el comando createIndex().

📌 Ejemplo: Índice en el campo nombre

1db.productos.createIndex({ nombre: 1 })

🔹 ¿Qué significa { nombre: 1 }?

  • 1 → Índice ascendente (de A a Z o de menor a mayor).
  • -1 → Índice descendente (de Z a A o de mayor a menor).

📌 Ejemplo: Índice en precio, ordenado de mayor a menor

1db.productos.createIndex({ precio: -1 })

✅ Ahora las búsquedas en nombre o precio serán mucho más rápidas.


3. Ver los Índices Creados

Para ver todos los índices de una colección, usamos:

1db.productos.getIndexes()

Esto mostrará los índices existentes en la colección.


4. Tipos de Índices en MongoDB

Tipo de ÍndiceDescripciónEjemplo
Índice simpleAcelera la búsqueda en un solo campo{ nombre: 1 }
Índice compuestoMejora búsquedas en múltiples campos{ marca: 1, precio: -1 }
Índice únicoEvita datos duplicados{ email: 1 }, unique: true
Índice parcialSolo indexa ciertos documentos{ stock: 1 }, partialFilterExpression: { stock: { $gt: 0 } }
Índice de textoPara búsquedas de palabras clave{ descripcion: "text" }
Índice geoespacialPara búsquedas de ubicación{ ubicacion: "2dsphere" }

5. Índices Compuestos (para varias columnas)

Si buscamos frecuentemente por marca y precio, podemos crear un índice compuesto:

1db.productos.createIndex({ marca: 1, precio: -1 })

✅ Ahora, las búsquedas que usen ambos campos serán más rápidas.


6. Índices Únicos (Evitar Datos Duplicados)

Si queremos que los correos electrónicos de los usuarios sean únicos, creamos un índice así:

1db.usuarios.createIndex({ email: 1 }, { unique: true })

Si alguien intenta insertar dos usuarios con el mismo email, MongoDB lo rechazará.


7. Índices de Texto (Búsqueda en Descripciones)

Si queremos buscar productos por descripción, usamos un índice de texto:

1db.productos.createIndex({ descripcion: "text" })

Ahora podemos buscar productos con ciertas palabras clave:

1db.productos.find({ $text: { $search: "rápido ligero" } })

MongoDB buscará productos que contengan esas palabras en la descripción.


8. Índices Geoespaciales (Ubicaciones en un Mapa)

Si queremos buscar negocios cercanos en un mapa, usamos un índice geoespacial:

1db.negocios.createIndex({ ubicacion: "2dsphere" })

Ejemplo de búsqueda de negocios en un radio de 1 km:

1db.negocios.find({
2  ubicacion: {
3    $near: {
4      $geometry: { type: "Point", coordinates: [40.4168, -3.7038] },
5      $maxDistance: 1000
6    }
7  }
8})

Útil para apps de mapas, delivery y transporte 🚗.


9. Optimización de Consultas

A veces, las consultas son lentas porque no usan los índices correctamente.

📌 Ver el rendimiento de una consulta con .explain()

1db.productos.find({ nombre: "Laptop" }).explain("executionStats")

Si el campo "IXSCAN" aparece en los resultados, significa que MongoDB usó un índice ✅.
Si aparece "COLLSCAN", significa que MongoDB revisó todos los documentos ❌.

👉 Si una consulta es lenta, revisa si hay un índice adecuado.


10. Eliminar Índices Innecesarios

Si ya no necesitamos un índice, podemos eliminarlo con:

1db.productos.dropIndex("nombre_1")

📌 Ver todos los índices antes de eliminarlos:

1db.productos.getIndexes()