Página inicial do Docs → Desenvolver aplicações → MongoDB Drivers → Driver GO
Índices
Nesta página
- Visão geral
- Cobertura e desempenho da query
- Considerações operacionais
- Tipos de índice
- Índices de campo único
- Índices compostos
- Índices de várias teclas (índices em campos de array)
- Índices aglomerados
- Índices de texto
- Índices geoespaciais
- Índices únicos
- Remover um Índice
- Informações adicionais
- Documentação da API
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. |
Classificar | 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
Especificar uma ordem de classificação de name
e age crescente ou name e age
decrescente 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 consultar em campos com nomes desconhecidos ou arbitrários. 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
O MongoDB suporta vários tipos de índice para apoiar consulta de 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 Í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)
Í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)
Índices de texto
Í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 de texto para múltiplos 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
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)
Í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)
Índices únicos
Í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: