Menu Docs
Página inicial do Docs
/ / /
Java síncrono
/

Indexes

Nesta página

  • Visão geral
  • Cobertura e desempenho da query
  • Considerações operacionais
  • Tipos de índice
  • Campo único e índices compostos
  • Índices de várias teclas (índices em campos de array)
  • Text Indexes
  • Índices geoespaciais
  • Unique Indexes
  • Índices curinga
  • Índices aglomerados
  • Remover um Índice
  • Remover um Índice usando um Documento de Especificação do Índice
  • Remover um índice usando um campo de nome
  • Remover um índice usando um caractere curinga

Neste guia, você pode aprender como usar indexes com o driver MongoDB Java.

Os índices suportam a execução eficiente de query no MongoDB. Sem índices, o MongoDB deve verificar todos os documentos de uma collection ( uma varredura de collection ) para encontrar os documentos que correspondem a cada query. Essas verificações da collection são lentas e podem afetar negativamente o desempenho do seu aplicativo. Se existir um índice apropriado para uma query, o MongoDB poderá usar o índice para limitar o número de documentos que deve inspecionar.

Índices também:

  • Permitir classificação eficiente

  • Habilitar recursos especiais como o geoespacial Atlas Search

  • Permitir adicionar restrições para garantir que um valor de campo seja exclusivo

  • E mais

Dica

Os índices também são usados pelas operações de atualização ao localizar os documentos para serem atualizados, excluir as operações ao localizar os documentos para serem excluídos e por determinadas etapas na aggregation pipeline.

Quando você executa uma query no MongoDB, seu comando pode incluir vários elementos:

  • Critérios de query que especificam campos e valores que você está procurando

  • Opções que afetam a execução da query (por exemplo referência de leitura)

  • critérios de projeção para especificar os campos que MongoDB deve retornar (opcional)

  • Classificar critérios para especificar os documentos do pedido serão devolvidos do MongoDB (opcional)

Quando todos os campos especificados na query, projeção e classificação encontram-se no mesmo índice, o MongoDB gera resultados diretamente do índice, também chamado de query coberta.

Importante

Ordem de classificação

Os 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 usaria esse índice quando você classificar seus dados por:

  • name ascendente, descendente age

  • name descendente, ascendente age

Especificar uma ordem de classificação de name e age ascendente ou name e age descendente exigiria uma classificação na memória.

Para obter informações adicionais sobre como garantir que seu índice cubra seus critérios de query e projeção, consulte os artigos do manual do MongoDB sobre cobertura de query.

Para melhorar o desempenho da query, crie índices em campos que aparecem com frequência nas queries e operações do seu aplicativo que retornam resultados ordenados. Cada índice que você adiciona consome espaço em disco e memória quando ativo, portanto, você deve rastrear a memória do índice e o uso do disco para o planejamento da capacidade. Além disso, quando uma operação de gravação atualiza um campo indexado, MongoDB também tem que atualizar o índice relacionado.

Como o MongoDB oferece suporte a esquemas dinâmicos, os aplicativos podem executar a query dos campos cujos nomes não podem ser conhecidos antecipadamente ou são 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 carga de trabalho.

Para obter mais informações sobre como projetar seu modelo de dados e escolher os índices apropriados para seu aplicativo, consulte MongoDB Server Modelagem de dados e .

O MongoDB oferece suporte a vários tipos de índices diferentes para auxiliar na consulta de seus dados. As seções a seguir descrevem os tipos de índice mais comuns e fornecem código de amostra para criar cada tipo de índice. Para obter uma lista completa dos tipos de índice, consulte Índices.

Dica

O MongoDB Java Driver fornece a classe Índices que inclui métodos de fábrica estáticos para criar documentos de especificação de índice para diferentes tipos de chave do MongoDB Index.

Os exemplos a seguir usam o método createIndex() para criar vários índices e a seguinte configuração:

import com.mongodb.DuplicateKeyException;
import com.mongodb.MongoCommandException;
import com.mongodb.client.*;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.Indexes;
import com.mongodb.client.model.Sorts;
import com.mongodb.client.model.geojson.Point;
import com.mongodb.client.model.geojson.Position;
import org.apache.log4j.BasicConfigurator;
import org.bson.Document;
import org.bson.conversions.Bson;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Projections.*;
final String uri = "mongodb+srv://<atlas-uri>/<dbname>?retryWrites=true&w=majority";
mongoClient = MongoClients.create(uri);
database = mongoClient.getDatabase("sample_mflix");
collection = database.getCollection("movies");

Os índices de campo único são índices com uma referência a um único campo dentro dos documentos de uma coleção. Eles melhoram o desempenho da consulta de campo único e da classificação e oferecem suporte a índices TTL que removem automaticamente documentos de uma coleção após um determinado período de tempo ou em um horário específico.

Observação

O índice _id_ é um exemplo de um único índice de campo. Este índice é criado automaticamente no campo _id quando uma nova coleção é criada.

O exemplo a seguir cria um índice em ordem crescente no campo title:

String resultCreateIndex = collection.createIndex(Indexes.ascending("title"));
System.out.println(String.format("Index created: %s", resultCreateIndex));

O seguinte é um exemplo de uma query que seria coberta pelo índice criado no trecho de código anterior:

Bson filter = eq("title", "Batman");
Bson sort = Sorts.ascending("title");
Bson projection = fields(include("title"), excludeId());
FindIterable<Document> cursor = collection.find(filter).sort(sort).projection(projection);

Para obter mais informações, consulte Índices de campo único no manual do MongoDB Server.

Os índices compostos contêm referências a vários campos dentro dos documentos de uma collection, melhorando o desempenho de query e classificação.

Dica

Leia mais sobre índices compostos, prefixos de índice e ordem de classificação aqui.

O exemplo seguinte cria um índice composto nos campos type e rated:

String resultCreateIndex = collection.createIndex(Indexes.ascending("type", "rated"));
System.out.println(String.format("Index created: %s", resultCreateIndex));

O seguinte é um exemplo de uma query que seria coberta pelo índice criado no trecho de código anterior:

Bson filter = and(eq("type", "movie"), eq("rated", "G"));
Bson sort = Sorts.ascending("type", "rated");
Bson projection = fields(include("type", "rated"), excludeId());
FindIterable<Document> cursor = collection.find(filter).sort(sort).projection(projection);

Para obter mais informações, consulte Índices compostos no manual do servidor MongoDB.

Os índices de várias chaves são índices que melhoram o desempenho de queries que especificam um campo com um índice que contém um valor de array. Você pode definir um índice de múltiplas chaves utilizando a mesma sintaxe de um único campo ou índice composto.

O exemplo a seguir cria um índice composto de várias chaves nos campos rated, genres (uma array de Strings) e title :

String resultCreateIndex = collection.createIndex(Indexes.ascending("rated", "genres", "title"));
System.out.println(String.format("Index created: %s", resultCreateIndex));

O seguinte é um exemplo de uma query que seria coberta pelo índice criado no trecho de código anterior:

Bson filter = and(eq("genres", "Animation"), eq("rated", "G"));
Bson sort = Sorts.ascending("title");
Bson projection = fields(include("title", "rated"), excludeId());
FindIterable<Document> cursor = collection.find(filter).sort(sort).projection(projection);

Os índices multicamadas se comportam de forma diferente de outros índices em termos de cobertura de consulta, computação vinculada a índice e comportamento de classificação. Para obter uma explicação completa dos índices de várias chaves, incluindo uma discussão sobre seu comportamento e limitações, consulte a página Índices de várias chaves no manual do MongoDB.

Os índices de texto suportam queries de pesquisa de texto no conteúdo de string. Esses índices podem incluir qualquer campo cujo valor seja uma string ou uma array de elementos de string. 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.

Dica

Os índices de texto diferem dos índices de pesquisa de texto completo mais poderosos do Atlas. Os usuários do Atlas devem usar o Atlas Search.

O exemplo seguinte cria um índice de texto no campo plot:

try {
String resultCreateIndex = collection.createIndex(Indexes.text("plot"));
System.out.println(String.format("Index created: %s", resultCreateIndex));
// Prints a message if a text index already exists with a different configuration
} catch (MongoCommandException e) {
if (e.getErrorCodeName().equals("IndexOptionsConflict"))
System.out.println("there's an existing text index with different options");
}

O seguinte é um exemplo de uma query que usaria o índice criado no trecho de código anterior. Observe que o sort é omitido porque os índices de texto não contêm ordem de classificação.

Bson filter = text("java coffee shop");
Bson projection = fields(include("fullplot"), excludeId());
FindIterable<Document> cursor = collection.find(filter).projection(projection);

Uma collection só pode conter um índice de texto. Se você deseja criar um índice de texto para múltiplos campos de texto, você precisa criar um índice composto. Uma pesquisa de texto é executada em todos os campos de texto dentro do índice composto.

O seguinte trecho cria um índice de texto composto para os campos title e genre:

collection.createIndex(Indexes.compoundIndex(Indexes.text("title"), Indexes.text("genre")));

Para obter mais informações, consulte as seguintes entradas manuais do servidor:

O MongoDB suporta queries de dados de coordenadas geoespaciais utilizando índices dsphere do2. Com um índice 2dsphere , você pode executar query dos dados geoespaciais para inclusão, interseção e proximidade. Para mais informações sobre query de dados geoespaciais, consulte queries geoespaciais .

Para criar um índice do 2dsphere , você deve especificar um campo que contém somente Objetos GeoJSON. Para mais detalhes sobre este tipo, consulte a página manual do MongoDB Server em Objetos GeoJSON.

O campo location.geo no seguinte documento de amostra da coleção theaters no banco de dados sample_mflix é 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 resultará em um erro.

try {
String resultCreateIndex = collection.createIndex(Indexes.geo2dsphere("location.geo"));
System.out.println(String.format("Index created: %s", resultCreateIndex));
// Prints a message if a geospatial index already exists with a different configuration
} catch (MongoCommandException e) {
if (e.getErrorCodeName().equals("IndexOptionsConflict"))
System.out.println("there's an existing geospatial index with different options");
}

O seguinte é um exemplo de uma consulta geoespacial utilizando "location.geo" índice.

// Stores the coordinates of the NY MongoDB headquarters
Point refPoint = new Point(new Position(-73.98456, 40.7612));
// Retrieves documents that represent locations up to 1000 meters from the specified point directly from the geospatial index
// Creates a filter to match a document
Bson filter = near("location.geo", refPoint, 1000.0, 0.0);
FindIterable<Document> cursor = collection.find(filter);

O MongoDB também suporta índices 2d para calcular distâncias em um plano euclidiano e para trabalhar com a sintaxe dos "legacy coordinate pairs" usada no MongoDB 2.2 e anteriores. Para obter mais informações, consulte a página de queries geoespaciais no manual do MongoDB Server.

Í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 collection. Para criar um índice único, especifique o campo ou a combinação de campos em que você deseja evitar a duplicação e defina a opção unique para true.

O exemplo seguinte cria um índice descendente único no campo theaterId:

try {
IndexOptions indexOptions = new IndexOptions().unique(true);
String resultCreateIndex = collection.createIndex(Indexes.descending("theaterId"), indexOptions);
System.out.println(String.format("Index created: %s", resultCreateIndex));
// Prints a message if the "theaterID" field contains duplicate values
} catch (DuplicateKeyException e) {
System.out.printf("duplicate field values encountered, couldn't create index: \t%s\n", e);
}

Importante

Se você executar uma operação de gravação que armazena um valor duplicado que viola o índice único, o driver Java do MongoDB gerará um DuplicateKeyException e o MongoDB lançará um erro semelhante ao seguinte:

E11000 duplicate key error index

Para obter mais informações, consulte a página Índices únicos no manual do MongoDB Server.

Os índices curinga permitem queries em campos desconhecidos ou arbitrários. Esses índices podem ser benéficos se você estiver usando um esquema dinâmico.

O exemplo seguinte cria um índice curinga ascendente em todos os valores do campo location, incluindo valores aninhados em subdocumentos e arrays:

String resultCreateIndex = collection.createIndex(Indexes.ascending("location.$**"));
System.out.println(String.format("Index created: %s", resultCreateIndex));

Para obter mais informações, consulte a página Índices curinga no manual do servidor MongoDB.

Os índices de cluster instruem a collection a armazenar documentos ordenados por um valor de chave. 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 vendors:

MongoDatabase database = mongoClient.getDatabase("tea");
ClusteredIndexOptions clusteredIndexOptions = new ClusteredIndexOptions(new Document("_id", 1), true);
CreateCollectionOptions createCollectionOptions = new CreateCollectionOptions().clusteredIndexOptions(clusteredIndexOptions);
database.createCollection("vendors", createCollectionOptions);

Consulte as seções manuais do servidor MongoDB para obter mais informações:

Você pode remover qualquer índice não utilizado, exceto o índice exclusivo padrão no campo _id.

As seções a seguir mostram as maneiras de remover índices:

  • Usando um documento de especificação de índice

  • Usando um campo de nome indexado

  • Usando um caractere curinga para remover todos os índices

Passe um documento de especificação de índice para o método dropIndex() para remover um índice de uma coleção. Um documento de especificação de índice é uma instância do Bson que especifica o tipo de índice em um campo especificado.

O seguinte trecho remove um índice ascendente no campo title em uma coleção:

collection.dropIndex(Indexes.ascending("title"));

Importante

Se você deseja descartar um índice de texto, você deve utilizar o nome do índice. Consulte a seção Remover um índice usando um campo de nome para obter detalhes.

Passe o campo name do índice para o método dropIndex() para remover um índice de uma coleção.

Se você precisar localizar o nome do seu índice, utilize o método listIndexes() para visualizar o valor dos campos name em seus índices.

O trecho a seguir recupera e imprime todos os índices em uma coleção:

collection.listIndexes().forEach(doc -> System.out.println(doc.toJson()));

Se você chamar listIndex() em uma coleção que contém um índice de texto, a saída poderá se assemelhar ao seguinte:

{ "v": 2, "key": {"_id": 1}, "name": "_id_" }
{ "v": 2, "key": {"_fts": "text", "_ftsx": 1}, "name": "title_text", "weights": {"title": 1},
"default_language": "english", "language_override": "language", "textIndexVersion": 3 }

Essa saída nos informa que os nomes dos índices existentes são "_id" e "title_text".

O trecho a seguir remove o índice "title_text" da coleção:

collection.dropIndex("title_text");

Observação

Não é possível remover um único campo de um índice de texto composto. Você deve soltar o índice inteiro e criar um novo para atualizar os campos indexados.

A partir do MongoDB 4.2, você pode soltar todos os índices ligando para o método dropIndexes() em sua coleção:

collection.dropIndexes();

Para versões anteriores do MongoDB, passe "*" como parâmetro para sua chamada para dropIndex() em sua coleção:

collection.dropIndex("*");

Para obter mais informações sobre os métodos nesta seção, consulte a seguinte documentação da API:

Voltar

Agregação