Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Optimiza las consultas utilizando índices

En esta guía, puede aprender a crear y gestionar índices utilizando el driver de MongoDB para Scala.

Los índices admiten la ejecución eficiente de queries en MongoDB. Sin índices, MongoDB debe realizar un escaneo de colección, leyendo cada documento de una colección para encontrar coincidencias de query. Los escaneos de colección pueden ralentizar el rendimiento de la aplicación. Si existe un índice apropiado para una query, MongoDB utiliza ese índice para limitar los documentos que inspecciona.

Los índices también permiten las siguientes capacidades:

Tip

MongoDB también utiliza índices al buscar documentos para operaciones de actualización y operaciones de eliminación. Ciertas etapas en el pipeline de agregación también utilizan índices para mejorar el rendimiento.

Cuando ejecuta una query en MongoDB, su comando puede incluir los siguientes elementos:

  • Criterios de consulta que especifican los campos y valores que buscas

  • Opciones que afectan la ejecución de la consulta, como el nivel de consistencia de lectura

  • Criterios de proyección que especifican los campos que MongoDB devuelve (opcional)

  • Criterios de orden para especificar el orden de los documentos devueltos (opcional)

Cuando todos los campos de la query, la proyección y la ordenación están en el mismo índice, MongoDB devuelve los resultados del índice. Este proceso se denomina query cubierta.

Importante

Orden de clasificación

Los criterios de clasificación deben coincidir o invertir el orden del índice.

Considere un índice en el campo name en orden ascendente (A-Z) y age en orden descendente (9-0):

name_1_age_-1

MongoDB utiliza este índice cuando ordenas tus datos por:

  • name ascendente, age descendente

  • name descendente, age ascendente

Especificar name y age ascendentes o descendentes requiere una clasificación en memoria.

Para obtener más información sobre la cobertura del índice, consulte Optimización de consultas en el manual de MongoDB Server.

Las siguientes pautas describen cómo puedes optimizar la forma en que tu aplicación utiliza los índices:

  • Para mejorar el rendimiento de las consultas, crea índices en los campos que aparecen con mayor frecuencia en las consultas de tu aplicación y en las operaciones que devuelven resultados ordenados.

  • Rastrea el uso de memoria y disco del índice para la planificación de la capacidad, ya que cada índice que añades consume espacio en disco y memoria cuando está activo.

  • Evite añadir índices que utilice con poca frecuencia. Tenga en cuenta que cuando una operación de escritura actualiza un campo indizado, MongoDB actualiza el índice relacionado.

Dado que MongoDB brinda soporte a esquemas dinámicos, las aplicaciones pueden realizar queries contra campos cuyos nombres no se pueden conocer de antemano o son arbitrarios. MongoDB 4.2 introdujo índices comodín para ayudar a respaldar estas consultas. Los índices comodín no están diseñados para reemplazar la planificación de índices basada en cargas de trabajo.

Para obtener más información sobre cómo diseñar su modelo de datos y elegir índices apropiados para su aplicación, consulte la documentación del servidor MongoDB sobre Estrategias de indexación y Modelado de datos e índices.

Puedes usar la siguiente aplicación de muestra para probar el código en esta página. Para usar la aplicación de muestra, realice los siguientes pasos:

  1. Asegúrate de tener instalado el driver de Scala en tu proyecto. Consulta la guía Descargar e Instalar para aprender más.

  2. Copia el siguiente código y pégalo en un nuevo archivo .scala.

  3. Copia un ejemplo de código de esta página y pégalo en las líneas especificadas del archivo.

import org.mongodb.scala._
import org.mongodb.scala.model.SearchIndexModel
import java.util.concurrent.TimeUnit
import scala.concurrent.Await
import scala.concurrent.duration.Duration
import org.mongodb.scala.model.Indexes
object SearchIndexes {
def main(args: Array[String]): Unit = {
// Create a new client and connect to the server
val mongoClient = MongoClient("<connection string URI>")
val database = mongoClient.getDatabase("<database name>")
val collection = database.getCollection("<collection name>")
// Start example code here
// End example code here
Thread.sleep(1000)
mongoClient.close()
}
}

Los ejemplos de esta guía utilizan la colección movies en la base de datos sample_mflix de los conjuntos de datos de ejemplo de Atlas. Para aprender cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Comienza con Atlas.

MongoDB admite varios tipos de índices diferentes para admitir la consulta de sus datos. Las siguientes secciones describen los tipos de índice más comunes y proporcionan código de muestra para crear cada tipo de índice. Para ver una lista completa de los tipos de índices, consulta Índices en el manual del servidor.

Índices de campo único son índices con una referencia a un solo campo dentro de los documentos de una colección. Mejoran el rendimiento de las queries de campo único y de la ordenación, y admiten Índices TTL que remueven automáticamente documentos de una colección tras un período de tiempo determinado o en un horario definido.

Nota

El índice _id_ es un ejemplo de un índice de un solo campo. Este índice se crea automáticamente en el campo _id cuando se crea una nueva colección.

El siguiente ejemplo crea un índice ascendente en el campo especificado:

val index = Indexes.ascending("<field name>")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para ejecutar los siguientes ejemplos en esta sección, debe incluir las siguientes instrucciones de importación en su archivo:

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

Utiliza el método createIndex() para crear un índice de campo único. El siguiente ejemplo crea un índice en orden ascendente en el campo title:

val index = Indexes.ascending("title")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Puedes verificar que se creó el índice utilizando el método listIndexes(). Deberías ver un índice para title en la lista, como se muestra en la siguiente salida:

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"title": 1}, "name": "title_1"}

A continuación, se muestra un ejemplo de una query que está cubierta por el índice creado en el campo title:

val filter = equal("title", "Sweethearts")
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))

Los índices compuestos contienen referencias a múltiples campos dentro de los documentos de una colección, mejorando la query y el rendimiento de clasificación.

Tip

Para obtener más información sobre los prefijos de índice, consulta la entrada Prefijos de índice en el manual de MongoDB Server.

El siguiente ejemplo crea un índice compuesto en los dos campos especificados.

val index = Indexes.compoundIndex(
Indexes.descending("<field name 1>"),
Indexes.ascending("<field name 2>")
)
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para ejecutar los siguientes ejemplos en esta sección, debe incluir las siguientes instrucciones de importación en su archivo:

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

Utilice el método createIndex() para crear un índice compuesto. El siguiente ejemplo crea un índice en orden descendente en el campo runtime y en orden ascendente en el campo year:

val index = Indexes.compoundIndex(Indexes.descending("runtime"),
Indexes.ascending("year"))
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Puedes verificar que el índice fue creado utilizando el método listIndexes(). Debería ver un índice para runtime y year en la lista, como se muestra en la siguiente salida:

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"runtime": -1, "year": 1}, "name": "runtime_-1_year_1"}

A continuación se muestra un ejemplo de una query que está cubierta por el índice creado en los campos runtime y year:

val filter = and(gt("runtime", 80), gt("year", 1999))
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))

Los índices multiclave son índices que mejoran el rendimiento de las queries en campos con valores de arreglo. Puede crear un índice multiclave en una colección utilizando el método createIndex() y la misma sintaxis que utiliza para crear un índice de un solo campo.

Al crear un índice multiclave, debes especificar los siguientes detalles:

  • Los campos sobre los que crear el índice

  • El orden de clasificación para cada campo (ascendente o descendente)

El siguiente ejemplo crea un índice de varias claves en el campo especificado que tiene valores de arreglo:

val index = Indexes.ascending("<field name>")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para ejecutar los siguientes ejemplos en esta sección, debe incluir las siguientes instrucciones de importación en su archivo:

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

Utiliza el método createIndex() para crear un índice múltiple. El siguiente ejemplo crea un índice en orden ascendente en el campo cast:

val index = Indexes.ascending("cast")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Puedes verificar que el índice se creó llamando al método listIndexes(). Deberías ver un índice para cast en la lista, como se muestra en la siguiente salida:

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"cast": 1}, "name": "cast_1"}

A continuación, se muestra un ejemplo de una query que está cubierta por el índice creado en el campo cast:

val filter = and(equal("cast", "Aamir Khan"), equal("cast", "Kajol"))
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))

MongoDB Search te permite realizar búsquedas de texto completo en colecciones alojadas en MongoDB Atlas. Los índices de búsqueda de MongoDB Search especifican el comportamiento de la búsqueda y cuáles campos indexar.

MongoDB Vector Search permite realizar búsquedas semánticas en incrustaciones vectoriales almacenadas en MongoDB. Para obtener más información sobre MongoDB Vector Search, consulte la Descripción general de MongoDB Vector Search.

Puedes llamar a los siguientes métodos en una colección para gestionar tus índices de MongoDB Search y MongoDB Vector Search:

  • createSearchIndex()

  • createSearchIndexes()

  • listSearchIndexes()

  • updateSearchIndex()

  • dropSearchIndex()

Nota

Los métodos de gestión de índices anteriores se ejecutan de forma asincrónica y podrían devolver resultados antes de confirmar que se ejecutaron correctamente. Para determinar el estado actual de los índices, llama al método listSearchIndexes().

Puede utilizar los métodos createSearchIndex() y createSearchIndexes() para crear uno o más índices de MongoDB Search o MongoDB Vector Search. El método createSearchIndexes() acepta una lista de definiciones de índice, lo que le permite crear varios índices en una sola llamada y especificar el tipo de índice para cada índice.

El siguiente ejemplo de código muestra cómo crear un índice de búsqueda de MongoDB:

val index = Document("mappings" -> Document("dynamic" -> true))
collection.createSearchIndex("<index name>", index)
.subscribe((result: String) => ())

Utilice el método createSearchIndexes() para crear varios índices de MongoDB Search o MongoDB Vector Search.

El siguiente ejemplo de código muestra cómo crear índices de MongoDB Search y MongoDB Vector Search en una sola llamada:

val searchIdxMdl = SearchIndexModel(
Option("searchIdx"),
Document("analyzer" -> "lucene.standard", "mappings" -> Document("dynamic" -> true)),
Option(SearchIndexType.search())
)
val vectorSearchIdxMdl = SearchIndexModel(
Option("vsIdx"),
Document(
"fields" -> List(
Document("type" -> "vector", "path" -> "embeddings", "numDimensions" -> 1536, "similarity" -> "dotProduct")
)
),
Option(SearchIndexType.vectorSearch())
)
collection.createSearchIndexes(List(searchIdxMdl, vectorSearchIdxMdl))
.subscribe((result: String) => ())

Para obtener más información sobre la sintaxis utilizada para definir índices de MongoDB Search, consulta la guía Referencia de índices en el manual de Atlas.

Puede usar el método listSearchIndexes() para devolver todos los índices de búsqueda de MongoDB en una colección.

El siguiente ejemplo de código muestra cómo imprimir una lista de los índices de búsqueda en una colección suscribiéndose al Observable devuelto por el método listSearchIndexes():

collection.listSearchIndexes()
.subscribe((result: Document) => println(result.toJson()))

Se puede utilizar el método updateSearchIndex() para actualizar un índice de Búsqueda de MongoDB.

El siguiente código muestra cómo actualizar un índice de búsqueda:

val updateIndex = Document("mappings" -> Document("dynamic" -> false))
collection.updateSearchIndex("<index to update>", updateIndex)
.subscribe((result: Unit) => ())

Puede usar el método dropSearchIndex() para borrar un índice de búsqueda de MongoDB.

Advertencia

Borrar índices de búsqueda y clústeres es irreversible

Borrar índice de búsqueda y clústeres asociados es una acción permanente. MongoDB no proporciona soporte para recuperar índice de búsqueda o datos borrados. Asegúrese de haber tomado las medidas adecuadas, como crear copias de seguridad, para evitar la pérdida de datos antes de continuar.

MongoDB no admite solicitudes para recuperar índices de búsqueda o datos eliminados. Usted es responsable de la integridad y las configuraciones de los datos.

El siguiente código muestra cómo eliminar un índice de búsqueda de una colección:

collection.dropSearchIndex("<index name>")
.subscribe((result: Unit) => ())

El siguiente ejemplo crea un 2índice dsphere en el campo especificado que contiene objetos GeoJSON:

val observable = collection.createIndex(Indexes.geo2dsphere("<2d index>"))
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para obtener más información sobre índices 2dsphere, consulte la guía de índices2dsphere en el manual de MongoDB Server.

Para obtener más información sobre el tipo GeoJSON, consulta la guía de Objetos GeoJSON en el manual de MongoDB Server.

Puedes remover cualquier índice no utilizado, excepto el índice único por defecto en el campo _id.

El siguiente ejemplo borra un índice con el nombre especificado:

val observable = collection.dropIndex("<index name>")
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para obtener más información sobre los métodos u objetos utilizados en esta guía, consulta la siguiente documentación de la API: