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
You can also use indexes in update operations, delete operations, and certain aggregation pipeline stages.
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:
nameascendente, descendenteagenamedescendente, ascendenteage
Especificar uma ordem de classificação de name e age ascendente ou name e age descendente requer uma classificação na memória.
To learn how to ensure your index covers your query criteria and projection, see Query Coverage.
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 consultar em campos com nomes desconhecidos ou arbitrários. O MongoDB 4.2 introduziu índices curinga para ajudar a suportar essas queries. Os índices curinga não são projetados para substituir o planejamento de índice baseado em volume 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
MongoDB supports several index types to support querying your data. The following sections describe and show how to create the most common index types. To view a full list of index types, see Indexes.
Í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)
Í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)
Í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)
Í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 collection só pode conter um índice de texto. Se você deseja criar um índice para vários campos de texto, você deve criar um índice composto. A pesquisa de texto é executada em todos os campos de texto dentro do índice composto.
Dica
Text indexes differ from the more powerful Atlas full text search indexes. We recommend MongoDB Search for Atlas users.
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)
Í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)
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)
Remover um Índice
Você pode remover qualquer índice não utilizado, 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 seguinte remove um índice ascendente no campo title na collection 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)
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 qualquer um dos métodos discutidos nesta guia, consulte a seguinte documentação da API: