Overview
En esta guía, puede aprender a utilizar índices en el controlador MongoDB Go.
Los índices facilitan la ejecución eficiente de consultas en MongoDB. Sin índices, MongoDB escanea cada documento de una colección (un escaneo de colección) para encontrar documentos que coincidan con la consulta. Los escaneos de colección son lentos y pueden afectar negativamente el rendimiento de la aplicación. Con un índice adecuado, MongoDB limita la cantidad de documentos que inspecciona.
Tip
También puede utilizar índices en operaciones de actualización, operaciones de eliminación y ciertas etapas del proceso de agregación.
Cobertura y rendimiento de las consultas
Una consulta en MongoDB puede contener los siguientes elementos:
Elemento | Necesidad | Propósito |
|---|---|---|
Query | Requerido | Especifique los campos y valores que está buscando. |
opciones | Opcional | Especifique cómo se ejecuta la consulta. |
Proyección | Opcional | Especifique los campos que devuelve MongoDB. |
Sort | Opcional | Especifique el orden en que MongoDB devuelve los documentos. |
Cuando se especifican estos elementos en el mismo índice, MongoDB devuelve resultados directamente del índice, también llamado consulta cubierta.
Importante
Criterios 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 (AZ) y age en orden descendente (9-0):
name_1_age_-1
MongoDB utiliza este índice cuando ordena sus datos mediante:
nameascendente,agedescendentenamedescendente,ageascendente
Sin embargo, especificar un orden de clasificación de ambos campos en la misma dirección requiere una clasificación en memoria.
Para saber cómo garantizar que su índice cubra sus criterios de consulta y proyección, consulte Cobertura de consultas.
Consideraciones operativas
Para mejorar el rendimiento de sus consultas, cree índices en los campos que aparecen con frecuencia en sus consultas y operaciones que devuelven resultados ordenados. Realice un seguimiento del uso de memoria y disco del índice para planificar la capacidad, ya que cada índice que agregue 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 admite esquemas dinámicos, su aplicación puede realizar consultas a campos con nombres desconocidos o arbitrarios. MongoDB 4.2 introdujo índices comodín para facilitar estas consultas. Los índices comodín no están diseñados para reemplazar la planificación de índices basada en la carga 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 Estrategias de indexación y Modelado de datos e índices.
Tipos de índice
MongoDB admite varios tipos de índices para facilitar la consulta de datos. Las siguientes secciones describen y muestran cómo crear los tipos de índices más comunes. Para ver una lista completa de tipos de índices, consulte Í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 matriz)
Los índices multiclave utilizan la misma sintaxis que los índices de campo único y compuestos. Este índice mejora el rendimiento de las consultas que especifican un campo de matriz como índice.
Ejemplo
El siguiente ejemplo crea un índice de clave múltiple 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 de búsqueda de MongoDB y búsqueda vectorial de MongoDB
Puede administrar mediante programación sus índices MongoDB Search y MongoDB Vector Search utilizando el controlador Go.
La función de búsqueda de MongoDB permite realizar búsquedas de texto completo en colecciones alojadas en MongoDB Atlas. Para obtener más información sobre la búsqueda de MongoDB, consulte la documentación de la búsqueda de MongoDB.
La Búsqueda Vectorial de MongoDB permite realizar búsquedas semánticas en incrustaciones vectoriales almacenadas en Atlas. Para obtener más información sobre la Búsqueda Vectorial de MongoDB, consulte la documentación de la Búsqueda Vectorial de MongoDB.
Para obtener más información sobre cómo ejecutar consultas de búsqueda vectorial de MongoDB, consulte Guía paraejecutar una consulta de búsqueda vectorial de MongoDB.
Las siguientes secciones contienen ejemplos de código que demuestran cómo administrar los índices de MongoDB Search y MongoDB Vector Search.
Crear un índice de búsqueda
Puede crear un índice de búsqueda MongoDB o de búsqueda vectorial MongoDB proporcionando una definición de índice al método SearchIndexView.CreateOne().
El siguiente ejemplo crea un índice de búsqueda de MongoDB en el campo plot de la colección sample_mflix.movies:
// Sets the index name and type to "search" const indexName = "search_index" opts := options.SearchIndexes().SetName(indexName).SetType("search") // Defines the index definition searchIndexModel := mongo.SearchIndexModel{ Definition: bson.D{ {Key: "mappings", Value: bson.D{ {Key: "dynamic", Value: false}, {Key: "fields", Value: bson.D{ {Key: "plot", Value: bson.D{ {Key: "type", Value: "string"}, }}, }}, }}, }, Options: opts, } // Creates the index searchIndexName, err := coll.SearchIndexes().CreateOne(ctx, searchIndexModel) if err != nil { log.Fatalf("Failed to create the MongoDB Search index: %v", err) }
El siguiente ejemplo crea un índice de búsqueda vectorial de MongoDB en el campo plot_embedding de la colección sample_mflix.embedded_movies:
// Defines the structs used for the index definition type vectorDefinitionField struct { Type string `bson:"type"` Path string `bson:"path"` NumDimensions int `bson:"numDimensions"` Similarity string `bson:"similarity"` Quantization string `bson:"quantization"` } type vectorDefinition struct { Fields []vectorDefinitionField `bson:"fields"` } // Sets the index name and type to "vectorSearch" const indexName = "vector_search_index" opts := options.SearchIndexes().SetName(indexName).SetType("vectorSearch") // Defines the index definition vectorSearchIndexModel := mongo.SearchIndexModel{ Definition: vectorDefinition{ Fields: []vectorDefinitionField{{ Type: "vector", Path: "plot_embedding", NumDimensions: 1536, Similarity: "dotProduct", Quantization: "scalar"}}, }, Options: opts, } // Creates the index searchIndexName, err := coll.SearchIndexes().CreateOne(ctx, vectorSearchIndexModel) if err != nil { log.Fatalf("Failed to create the MongoDB Vector Search index: %v", err) }
Listar un índice de búsqueda
Puede utilizar el método SearchIndexView.List() para enumerar un índice de búsqueda MongoDB o de búsqueda vectorial MongoDB especificando el nombre del índice.
El siguiente ejemplo enumera los detalles del índice de búsqueda MongoDB o de búsqueda vectorial MongoDB especificado:
// Specifies the index to retrieve const indexName = "myIndex" opts := options.SearchIndexes().SetName(indexName) // Retrieves the details of the specified index cursor, err := coll.SearchIndexes().List(ctx, opts) // Prints the index details to the console as JSON var results []bson.D if err := cursor.All(ctx, &results); err != nil { log.Fatalf("Failed to unmarshal results to bson: %v", err) } res, err := json.Marshal(results) if err != nil { log.Fatalf("Failed to marshal results to json: %v", err) } fmt.Println(res)
Actualizar un índice de búsqueda
Puede utilizar el método SearchIndexView.UpdateOne() para actualizar un índice de búsqueda MongoDB o de búsqueda vectorial MongoDB especificando el nombre del índice y la nueva definición del índice.
El siguiente ejemplo actualiza un índice de búsqueda vectorial de MongoDB proporcionando el nombre del índice y una nueva definición de índice:
// Specifies the index name and the new index definition const indexName = "vector_search_index" type vectorDefinitionField struct { Type string `bson:"type"` Path string `bson:"path"` NumDimensions int `bson:"numDimensions"` Similarity string `bson:"similarity"` } type vectorDefinition struct { Fields []vectorDefinitionField `bson:"fields"` } definition := vectorDefinition{ Fields: []vectorDefinitionField{ { Type: "vector", Path: "plot_embedding", NumDimensions: 1536, Similarity: "cosine", Quantization: "scalar", }, }, } // Updates the specified index err := coll.SearchIndexes().UpdateOne(ctx, indexName, definition) if err != nil { log.Fatalf("Failed to update the index: %v", err) }
Eliminar un índice de búsqueda
Puede utilizar el método SearchIndexView.DropOne() para eliminar un índice de búsqueda MongoDB o de búsqueda vectorial MongoDB especificando el nombre del índice.
El siguiente ejemplo elimina un índice de MongoDB Search o MongoDB búsqueda vectorial con el nombre especificado:
// Deletes the specified index err := coll.SearchIndexes().DropOne(ctx, "myIndex") if err != nil { log.Fatalf("Failed to delete the index: %v", err) }
Índices agrupados
Los índices agrupados mejoran el rendimiento de las operaciones de inserción, actualización y eliminación en colecciones agrupadas. Almacenan documentos ordenados por el valor de la clave del índice agrupado.
Para crear un índice agrupado, especifique la opción de índice agrupado con el campo _id como clave y el campo único como true cuando cree su colección.
Ejemplo
El siguiente ejemplo crea un índice agrupado 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 texto sobre contenido de cadenas. Este índice requiere un campo de cadena o una matriz de cadenas. MongoDB admite la búsqueda de texto en varios idiomas. Puede especificar el idioma predeterminado al crear el índice.
Una colección solo puede contener un índice de texto. Si desea crear un índice de texto para varios campos de texto, debe crear un índice compuesto. La consulta de texto se ejecuta en todos los campos de texto dentro del índice compuesto.
Tip
Recomendamos los índices de búsqueda de texto completo y de búsqueda vectorial de MongoDB, que son más potentes, para optimizar las búsquedas de texto. Para obtener más información sobre estos índices de búsqueda de texto completo, consulte la sección "Índices de búsqueda y de búsqueda vectorial de MongoDB".
Ejemplo
El siguiente ejemplo crea un índice de texto en el campo plot con italian como idioma 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 consultas que contienen datos de coordenadas geoespaciales mediante 2índices dsphere. Un 2dsphere índice debe estar en un campo de objetos GeoJSON.
Este índice le permite realizar lo siguiente:
Consultar datos geoespaciales para inclusión, intersección y proximidad.
Cálculo de distancias en un plano euclidiano y para trabajar con la sintaxis de "pares de coordenadas heredadas" 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 está cubierto por un índice geoespacial genera 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 garantizan que los campos indexados no almacenen valores duplicados. De forma predeterminada, 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
Eliminar un índice
Puede eliminar cualquier índice de una colección, excepto el índice único predeterminado en el campo _id. Para eliminar un índice, pase su nombre al método DropOne().
El siguiente ejemplo elimina un índice llamado title_1 de la colección sample_mflix.movies:
coll := client.Database("sample_mflix").Collection("movies") err := coll.Indexes().DropOne(context.TODO(), "title_1") if err != nil { panic(err) }
Información Adicional
Para conocer más sobre los índices mencionados, consulta las siguientes guías:
Para obtener más información sobre las operaciones mencionadas, consulte las siguientes guías:
Documentación de la API
Para obtener más información sobre los métodos analizados en esta guía y otros relacionados, consulte la siguiente documentación de API: