Menu Docs

Página inicial do DocsDesenvolver aplicaçõesMongoDB DriversDriver 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

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.

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, descendente age

  • name descendente, ascendente age

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.

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.

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.

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.

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)

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.

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)

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.

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)

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.

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 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.

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)

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.

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 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.

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)

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)

Para saber mais sobre os índices mencionados, consulte as seguintes guias:

Para saber mais sobre as operações mencionadas, consulte os seguintes guias:

Para saber mais sobre qualquer um dos métodos discutidos nesta guia, consulte a seguinte documentação da API:

← Agregação