Indexes
Visão geral
Nesta aba, você pode aprender como usar índices no Go Driver do MongoDB.
Os índices suportam a execução eficiente de queries no MongoDB. Sem índices, o MongoDB escaneia cada documento em uma collection (um escaneamento de collection) para encontrar documentos que correspondam à sua query. Os escaneamentos de collections são lentos e podem afetar negativamente o desempenho do seu aplicativo. Com um índice apropriado, o MongoDB limita o número de documentos inspecionados.
Dica
Você também pode usar índices em operações de atualização, operações de exclusão e determinados estágios do pipeline de agregação.
Cobertura e desempenho da query
Uma consulta no MongoDB pode conter os seguintes elementos:
Elemento | necessidade | Propósito |
---|---|---|
Query | Obrigatório | Especificar os campos e valores que você está procurando. |
Opções | Opcional | Especifique como a query é executada. |
Projeção | Opcional | Especificar os campos que o MongoDB retorna. |
Sort | Opcional | Especificar a ordem em que o MongoDB retorna os documentos. |
Ao especificar esses elementos no mesmo índice, o MongoDB gera resultados diretamente do índice, também chamado de query coberta.
Importante
Critérios de classificação
Seus critérios de classificação devem corresponder ou inverter a ordem do índice.
Considere um índice no campo name
em ordem crescente (A-Z) e age
em ordem decrescente (9-0):
name_1_age_-1
O MongoDB usa esse índice quando você classifica seus dados por:
name
ascendente, descendenteage
name
descendente, ascendenteage
No entanto, especificar uma ordem de classificação de ambos os campos na mesma direção requer uma classificação na memória.
Para saber como garantir que seu índice cubra seus critérios de query e projeção, consulte Cobertura de query.
Considerações operacionais
Para melhorar o desempenho de sua consulta, crie índices em campos que aparecem com frequência em suas consultas e operações que retornam resultados ordenados. Acompanhe a memória do índice e o uso do disco para o planejamento da capacidade, pois cada índice adicionado consome espaço em disco e memória. Além disso, quando uma operação de gravação atualiza um campo indexado, o MongoDB também deve atualizar o índice relacionado.
Como o MongoDB suporta esquemas dinâmicos, seu aplicativo pode fazer queries em campos com nomes desconhecidos ou arbitrários. O MongoDB 4.2 introduziu índices curinga para ajudar a suportar essas consultas. Os índices curinga não são projetados para substituir o planejamento de índice baseado em carga de trabalho.
Para saber mais sobre como criar seu modelo de dados e escolher índices apropriados para seu aplicativo, consulte Estratégias de Indexação e Modelagem de Dados e Índices.
Tipos de índice
O MongoDB suporta vários tipos de índice para possibilitar a execução de queries nos seus dados. As seções a seguir descrevem e mostram como criar os tipos de índice mais comuns. Para ver uma lista completa dos tipos de índice, consulte a página Índices.
Índices de campo único
Os índices de campo único mantêm uma referência a um campo dentro dos documentos de uma coleção.
Esse índice melhora as consultas de campo único e o desempenho da classificação, além de oferecer suporte a índices TTL que removem automaticamente documentos de uma coleção após um determinado período de tempo.
Observação
O índice _id_
é um exemplo de um único índice de campo. Este índice é criado automaticamente no campo _id
quando você cria uma nova coleção.
Exemplo
O exemplo seguinte cria um índice em ordem crescente no campo title
na coleção 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 compostos
Os índices compostos mantêm uma referência a vários campos dentro dos documentos de uma coleção. Este índice melhora o desempenho de consulta e classificação.
Exemplo
O exemplo seguinte cria um índice composto nos campos fullplot
e title
na collection 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 de várias teclas (índices em campos de array)
Os índices de múltiplas chaves utilizam a mesma sintaxe que um índice de campo único e um índice composto. Este índice melhora o desempenho de consultas que especificam um campo de matriz como um índice.
Exemplo
O exemplo seguinte cria um índice de múltiplas chaves no campo cast
na collection 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
Atlas Search e índices Atlas Vector Search
Você pode gerenciar programaticamente seus índices do Atlas Search e Atlas Vector Search usando o driver Go.
O recurso Atlas Search permite realizar pesquisas de texto completo em collections hospedadas no MongoDB Atlas. Para saber mais sobre o Atlas Search, consulte a documentação do Atlas Search.
O Atlas Vector Search permite realizar pesquisas semânticas em incorporações vetoriais armazenadas no Atlas. Para saber mais sobre o Atlas Vector Search, consulte a documentação do Atlas Vector Search.
Para saber mais sobre como executar queries do Atlas Vector Search, consulte o guia Executar uma query do Atlas Vector Search.
As seções seguintes contêm exemplos de código que demonstram como gerenciar índices Atlas Search e Atlas Vector Search .
Criar um índice de pesquisa
Você pode criar um índice do Atlas Search ou do Atlas Vector Search fornecendo uma definição de índice para o método SearchIndexView.CreateOne()
.
O exemplo seguinte cria um índice do Atlas Search no campo plot
da collection 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 Atlas Search index: %v", err) }
O exemplo seguinte cria um índice do Atlas Vector Search no campo plot_embedding
na collection 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 Atlas Vector Search index: %v", err) }
Listar um índice de pesquisa
Você pode utilizar o método SearchIndexView.List()
para listar um índice do Atlas Search ou Atlas Vector Search especificando o nome do índice.
O exemplo seguinte lista os detalhes do índice especificado do Atlas Search ou do Atlas Vector Search :
// 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)
Atualizar um Índice de Pesquisa
Você pode utilizar o método SearchIndexView.UpdateOne()
para atualizar um índice do Atlas Search ou Atlas Vector Search especificando o nome do índice e a nova definição de índice.
O exemplo seguinte atualiza um índice do Atlas Vector Search fornecendo o nome do índice e uma nova definição 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) }
Excluir um índice de pesquisa
Você pode utilizar o método SearchIndexView.DropOne()
para excluir um índice do Atlas Search ou Atlas Vector Search especificando o nome do índice.
O exemplo seguinte exclui um índice do Atlas Search ou Atlas Vector Search com o nome especificado:
// Deletes the specified index err := coll.SearchIndexes().DropOne(ctx, "myIndex") if err != nil { log.Fatalf("Failed to delete the index: %v", err) }
Índices aglomerados
Os índices clusterizados melhoram o desempenho das operações de inserção, atualização e exclusão em coleções clusterizadas. Coleções clusterizadas armazenam documentos ordenados pelo valor da chave do índice agrupado.
Para criar um índice de cluster, especifique a opção de índice de cluster com o campo _id
como a chave e o campo único como true
ao criar a collection.
Exemplo
O exemplo seguinte cria um índice agrupado no campo _id
na coleção 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
Índices de texto oferecem suporte a pesquisas de query de texto no conteúdo da string. Este índice exige um campo de string ou uma array de strings. O MongoDB suporta pesquisa de texto para vários idiomas. Você pode especificar o idioma padrão como uma opção ao criar o índice.
Uma coleção pode conter somente um índice de texto. Se você deseja criar um índice de texto para múltiplos campos de texto, deve criar um índice composto. A pesquisa de texto é executada em todos os campos de texto dentro do índice composto.
Dica
Os índices de texto diferem dos índices de Full Text Search mais poderosos do Atlas. Recomendamos a pesquisa do Atlas para usuários do Atlas.
Exemplo
O exemplo seguinte cria um índice de texto no campo plot
com italian
como o idioma padrão na coleção 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 geoespaciais
O MongoDB suporta queries contendo de dados de coordenadas geoespaciais usando índices 2dsphere. Um índice 2dsphere
deve estar em um campo de objetos GeoJSON.
Este índice permite que você execute o seguinte:
Consulta dados geoespaciais para inclusão, interseção e proximidade.
Cálculo de distâncias em um plano euclidiano e para trabalhar com a sintaxe de "pares de coordenadas legados" usada no MongoDB 2.2 e anteriores.
Exemplo
O campo location.geo
em um documento da collection sample_mflix.theaters
é um objeto de ponto GeoJSON que descreve as coordenadas do 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 ] } } }
O seguinte exemplo cria um índice 2dsphere
no campo location.geo
:
Importante
Tentar criar um índice geoespacial em um campo que é coberto por um índice geoespacial resulta em um erro.
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
Índices únicos garantem que os campos indexados não armazenem valores duplicados. Por padrão, o MongoDB cria um índice único no campo _id
durante a criação de uma coleção.
Para criar um índice exclusivo, especifique o campo ou a combinação de campos em que você deseja evitar a duplicação e defina a opção unique
como true
.
Exemplo
O exemplo seguinte cria um índice descendente único no 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 um Índice
Você pode excluir qualquer índice de uma collection, exceto o índice único padrão no campo _id
. Para remover um índice, passe o nome do seu índice para o método DropOne()
.
O exemplo a seguir remove um índice chamado title_1
da collection sample_mflix.movies
:
coll := client.Database("sample_mflix").Collection("movies") err := coll.Indexes().DropOne(context.TODO(), "title_1") if err != nil { panic(err) }
Informações adicionais
Para saber mais sobre os índices mencionados, consulte as seguintes guias:
Para saber mais sobre as operações mencionadas, consulte os seguintes guias:
Documentação da API
Para saber mais sobre os métodos discutidos neste guia e outros relacionados, consulte a seguinte documentação da API: