Overview
En esta guía, usted puede aprender cómo usar índices en el driver Go de MongoDB.
Los índices permiten ejecutar consultas de manera eficiente en MongoDB. Sin índices, MongoDB escanea cada documento en una colección (un escaneo de colección) para encontrar documentos que coincidan con tu query. Los escaneo de colección son lentos y pueden afectar negativamente el rendimiento de su aplicación. Con un índice adecuado, MongoDB limita el número de documentos que inspecciona.
Tip
También puedes utilizar índices en operaciones de actualización, operaciones de eliminación y ciertas etapas del pipeline de agregación.
Cobertura y rendimiento de la query
Una query en MongoDB puede contener los siguientes elementos:
Elemento | Necesidad | Propósito |
|---|---|---|
Query | Requerido | Especifica los campos y valores que buscas. |
opciones | Opcional | Especifica cómo se ejecuta la query. |
Proyección | Opcional | Especifica los campos que MongoDB devuelve. |
Sort | Opcional | Especifica el orden en el que MongoDB devuelve documentos. |
Cuando especificas estos elementos en el mismo índice, MongoDB devuelve resultados directamente del índice, lo que también se llama covered query.
Importante
Criterios de ordenación
Tus criterios de ordenación deben coincidir o invertir el orden del índice.
Considera 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:
nameascendente,agedescendentenamedescendente,ageascendente
Especificar un orden de clasificación de name y age ascendente o name y age descendente requieren una clasificación en memoria.
Para saber cómo asegurarse de que su índice cubre los criterios de query y proyección, consulta Cobertura de la query.
Consideraciones operativas
Para mejorar el rendimiento de las queries, crea índices en los campos que aparecen con frecuencia en tus queries y operaciones que devuelven resultados ordenados. Rastrea el uso de memoria y disco de índices para la planificación de capacidad, ya que cada índice que agregas consume espacio en disco y memoria. Además, cuando una operación de escritura actualiza un campo indexado, MongoDB también debe actualizar el índice relacionado.
Dado que MongoDB soporta esquemas dinámicos, tu aplicación puede consultar campos con nombres desconocidos o 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 tu modelo de datos y elegir índices apropiados para tu aplicación, consulta Estrategias de indexación y Modelado de datos e índices.
Tipos de índice
MongoDB admite varios tipos de índices para facilitar la consulta de sus datos. Las siguientes secciones describen y muestran cómo crear los tipos de índices más comunes. Para ver una lista completa de los tipos de índices, consulta Índices.
Índices de un solo campo
Los índices de campo único mantienen una referencia a un campo dentro de los documentos de una colección.
Este índice mejora las queries de un solo campo y el rendimiento de la ordenación, y admite índices TTL que remueven automáticamente documentos de una colección después de un cierto tiempo.
Nota
El índice _id_ es un ejemplo de índice de un solo campo. Este índice se crea automáticamente en el campo _id cuando creas una nueva colección.
Ejemplo
El siguiente ejemplo crea un índice en orden ascendente en el campo title de la colección sample_mflix.movies:
coll := client.Database("sample_mflix").Collection("movies") indexModel := mongo.IndexModel{ Keys: bson.D{{"title", 1}}, } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Name of Index Created: title_1
Índices compuestos
Los índices compuestos tienen una referencia a varios campos dentro de los documentos de una colección. Este índice mejora el rendimiento de query y orden.
Ejemplo
El siguiente ejemplo crea un índice compuesto en los campos fullplot y title de la colección sample_mflix.movies:
coll := client.Database("sample_mflix").Collection("movies") indexModel := mongo.IndexModel{ Keys: bson.D{ {"fullplot", -1}, {"title", 1} } } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Name of Index Created: fullplot_-1_title_1
Índices multiclave (índices en campos de arreglos)
Los índices multiclave emplean la misma sintaxis que un índice de campo único y un índice compuesto. Este índice mejora el rendimiento de las queries que especifican un campo de arreglo como índice.
Ejemplo
El siguiente ejemplo crea un índice multikey en el campo cast de la colección sample_mflix.movies:
coll := client.Database("sample_mflix").Collection("movies") indexModel := mongo.IndexModel{ Keys: bson.D{{"cast", -1}} } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Name of Index Created: cast_-1
Índices clusterizados
Los índices agrupados mejoran el rendimiento de las operaciones de inserción, actualización y eliminación en colección con índice clusterizado. Las colecciones agrupadas almacenan documentos ordenados por el valor clave del índice agrupado.
Para crear un índice agrupado, especifica la opción de índice agrupado con el campo _id como clave y el campo único como true cuando crees tu colección.
Ejemplo
El siguiente ejemplo crea un índice clusteringado en el campo _id de la colección db.tea:
db := client.Database("db") cio := bson.D{{"key", bson.D{{"_id", 1}}}, {"unique", true}} opts := options.CreateCollection().SetClusteredIndex(cio) db.CreateCollection(context.TODO(), "tea", opts)
Text Indexes
Los índices de texto admiten consultas de búsqueda de texto en contenido de cadenas. Este índice requiere un campo de string o un arreglo de strings. MongoDB admite búsqueda de texto para varios lenguajes. Puedes especificar el lenguaje por defecto como una opción al crear el índice.
Una colección solo puede contener un índice de texto. Si deseas crear un índice de texto para múltiples campos de texto, debes crear un índice compuesto. La búsqueda de texto se ejecuta en todos los campos de texto dentro del índice compuesto.
Tip
Los índices de texto se diferencian de los índices de búsqueda de texto completo de Atlas, que son más potentes. Recomendamos MongoDB Search para los usuarios de Atlas.
Ejemplo
El siguiente ejemplo crea un índice de texto en el campo plot con italian como lenguaje predeterminado en la colección sample_mflix.movies:
coll := client.Database("sample_mflix").Collection("movies") indexModel := mongo.IndexModel{Keys: bson.D{{"plot", "text"}, {"default_language", "italian"}}} name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Name of Index Created: plot_text
Índices geoespaciales
MongoDB admite **queries** que contienen datos de coordenadas geoespaciales mediante el uso de **índices 2dsphere**. Un índice 2dsphere debe estar en un campo de objetos GeoJSON.
Este índice permite realizar lo siguiente:
Consulta datos geoespaciales para inclusión, intersección y proximidad.
Cálculo de distancias en un plano euclidiano y para trabajar con la sintaxis de “legacy coordinate pairs” utilizada en MongoDB 2.2 y versiones anteriores.
Ejemplo
El campo location.geo en un documento de la colección sample_mflix.theaters es un objeto punto GeoJSON que describe las coordenadas del teatro:
{ "_id" : ObjectId("59a47286cfa9a3a73e51e75c"), "theaterId" : 104, "location" : { "address" : { "street1" : "5000 W 147th St", "city" : "Hawthorne", "state" : "CA", "zipcode" : "90250" }, "geo" : { "type" : "Point", "coordinates" : [ -118.36559, 33.897167 ] } } }
El siguiente ejemplo crea un índice 2dsphere en el campo location.geo:
Importante
Intentar crear un índice geoespacial en un campo que ya está cubierto por un índice geoespacial resulta en un error.
indexModel := mongo.IndexModel{ Keys: bson.D{{"location.geo", "2dsphere"}} } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
location.geo_2dsphere
Unique Indexes
Los índices únicos aseguran que los campos indexados no almacenen valores duplicados. Por defecto, MongoDB crea un índice único en el campo _id durante la creación de una colección.
Para crear un índice único, especifique el campo o la combinación de campos en los que desea evitar la duplicación y defina la opción unique en true.
Ejemplo
El siguiente ejemplo crea un índice descendente único en el campo theaterId:
indexModel := mongo.IndexModel{ Keys: bson.D{{"theaterId", -1}}, Options: options.Index().SetUnique(true), } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Name of Index Created: theaterId_-1
Remover un índice
Puedes remover cualquier índice no utilizado, excepto el índice único por defecto en el campo _id. Para remover un índice, pasa el nombre de tu índice al método DropOne().
El siguiente ejemplo elimina un índice ascendente en el campo title de la colección sample_mflix.movies:
coll := client.Database("sample_mflix").Collection("movies") res, err := coll.Indexes().DropOne(context.TODO(), "title_1") if err != nil { panic(err) } fmt.Println(res)
{"nIndexesWas": {"$numberInt":"2"}}
Información Adicional
Para conocer más sobre los índices mencionados, consulta las siguientes guías:
Para aprender más sobre las operaciones mencionadas, consulte las siguientes guías:
Documentación de la API
Para conocer más sobre cualquiera de los métodos descritos en esta guía, consulte la siguiente documentación de API: