Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Otimizar consultas usando índices

Neste guia, você pode aprender como criar e gerenciar índices usando o MongoDB Scala Driver.

Os índices suportam a execução eficiente de queries no MongoDB. Sem índices, o MongoDB deve executar uma varredura de coleção, lendo cada documento em uma coleção para encontrar correspondências de query. As varreduras de coleção podem diminuir o desempenho do seu aplicativo. Se existir um índice apropriado para uma query, o MongoDB usará esse índice para limitar os documentos que ele inspeciona.

Os índices também permitem as seguintes funcionalidades:

Dica

MongoDB also uses indexes when finding documents for update operations and delete operations. Certain stages in the aggregation pipeline also use indexes to improve performance.

Quando você executa uma query no MongoDB, seu comando pode incluir os seguintes elementos:

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

  • Opções que afetam a execução da query, como a read concern

  • Critérios de projeção que especificam os campo que o MongoDB retorna (opcional)

  • Critérios de classificação que especificam a ordem em que os documento são retornados (opcional)

Quando todos os campos na query, projeção e classificação estão no mesmo índice, o MongoDB retorna resultados do índice. Esse processo é 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 usa esse índice quando você classifica seus dados por:

  • name ascendente, descendente age

  • name descendente, ascendente age

Especificar name e age ambos ascendentes ou ambos descendentes requer uma classificação na memória.

For more information about index coverage, see Query Optimization in the MongoDB Server manual.

As diretrizes a seguir descrevem como você pode otimizar a forma como seu aplicativo usa índices:

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

  • 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 quando ativo.

  • Evite adicionar índices que você usa com pouca frequência. Observe que quando uma operação de gravação atualiza um campo indexado, o MongoDB atualiza o índice relacionado.

Since MongoDB supports dynamic schemas, applications can query against fields whose names cannot be known in advance or are arbitrary. MongoDB 4.2 introduced wildcard indexes to help support these queries. Wildcard indexes are not designed to replace workload-based index planning.

Para obter mais informações sobre como projetar seu modelo de dados e escolher índices apropriados para seu aplicativo, consulte a documentação do servidor MongoDB sobre Estratégias de indexação e Modelagem de dados e índices.

Você pode usar o seguinte aplicação de amostra para testar o código nesta página. Para usar o aplicação de amostra , execute as seguintes etapas:

  1. Verifique se você tem o driver Scala instalado em seu projeto. Consulte o guia Download e instalação para saber mais.

  2. Copie o seguinte código e cole-o em um novo arquivo .scala .

  3. Copie um exemplo de código desta página e cole-o nas linhas especificadas no arquivo.

import org.mongodb.scala._
import org.mongodb.scala.model.SearchIndexModel
import java.util.concurrent.TimeUnit
import scala.concurrent.Await
import scala.concurrent.duration.Duration
import org.mongodb.scala.model.Indexes
object SearchIndexes {
def main(args: Array[String]): Unit = {
// Create a new client and connect to the server
val mongoClient = MongoClient("<connection string URI>")
val database = mongoClient.getDatabase("<database name>")
val collection = database.getCollection("<collection name>")
// Start example code here
// End example code here
Thread.sleep(1000)
mongoClient.close()
}
}

The examples in this guide use the movies collection in the sample_mflix database from the Atlas sample datasets. To learn how to create a free MongoDB Atlas cluster and load the sample datasets, see Get Started with Atlas.

O MongoDB suporta vários tipos de índice 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 no manual do servidor MongoDB.

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 seguinte cria um índice ascendente no campo especificado:

val index = Indexes.ascending("<field name>")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para executar os exemplos a seguir nesta seção, você deve incluir as seguintes declarações de importação em seu arquivo:

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

Utilize o método createIndex() para criar um índice de campo único. O exemplo seguinte cria um índice em ordem crescente no campo title :

val index = Indexes.ascending("title")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Você pode verificar se o índice foi criado usando o método listIndexes(). Você deve ver um índice para title na lista, conforme mostrado na seguinte saída:

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"title": 1}, "name": "title_1"}

O seguinte é um exemplo de uma query coberta pelo índice criado no campo title :

val filter = equal("title", "Sweethearts")
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))

Os índices compostos contêm referências a vários campos nos documentos de uma coleção, melhorando o desempenho de consulta e classificação.

Dica

To learn more about index prefixes see the Index Prefixes entry in the MongoDB Server manual.

O exemplo seguinte cria um índice composto nos dois campos especificados.

val index = Indexes.compoundIndex(
Indexes.descending("<field name 1>"),
Indexes.ascending("<field name 2>")
)
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para executar os exemplos a seguir nesta seção, você deve incluir as seguintes declarações de importação em seu arquivo:

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

Utilize o método createIndex() para criar um índice composto. O exemplo a seguir cria um índice em ordem decrescente no campo runtime e em ordem crescente no campo year :

val index = Indexes.compoundIndex(Indexes.descending("runtime"),
Indexes.ascending("year"))
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Você pode verificar se o índice foi criado usando o método listIndexes(). Você deve ver um índice para runtime e year na lista, conforme mostrado na seguinte saída:

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"runtime": -1, "year": 1}, "name": "runtime_-1_year_1"}

O seguinte é um exemplo de uma consulta coberta pelo índice criado nos campos runtime e year :

val filter = and(gt("runtime", 80), gt("year", 1999))
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))

Multikey indexes are indexes that improve the performance of queries on array-valued fields. You can create a multikey index on a collection by using the createIndex() method and the same syntax that you use to create a single field index.

Ao criar um índice de múltiplas chaves, você deve especificar os seguintes detalhes:

  • Os campos nos quais criar o índice

  • A ordem de classificação para cada campo (crescente ou decrescente)

O exemplo a seguir cria um índice de múltiplas chaves no campo com valor de array especificado:

val index = Indexes.ascending("<field name>")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para executar os exemplos a seguir nesta seção, você deve incluir as seguintes declarações de importação em seu arquivo:

import org.mongodb.scala._
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.IndexOptions._
import org.mongodb.scala.model.Filters._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import java.util.concurrent.TimeUnit

Utilize o método createIndex() para criar um índice de múltiplas chaves. O exemplo seguinte cria um índice em ordem crescente no campo cast :

val index = Indexes.ascending("cast")
val observable = collection.createIndex(index)
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Você pode verificar se o índice foi criado chamando o método listIndexes(). Você deve ver um índice para cast na lista, conforme mostrado na seguinte saída:

collection.listIndexes().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"v": 2, "key": {"cast": 1}, "name": "cast_1"}

O seguinte é um exemplo de uma query coberta pelo índice criado no campo cast :

val filter = and(equal("cast", "Aamir Khan"), equal("cast", "Kajol"))
collection.find(filter).first().subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))

MongoDB Search enables you to perform full-text searches on collections hosted on MongoDB Atlas. MongoDB Search indexes specify the behavior of the search and which fields to index.

A MongoDB Vector Search permite que você realize uma pesquisa semântica em vetores incorporados armazenados no MongoDB. Para saber mais sobre o MongoDB Vector Search, consulte a Visão geral do MongoDB Vector Search.

Você pode chamar os seguintes métodos em uma coleção para gerenciar seus índices MongoDB Search e MongoDB Vector Search :

  • createSearchIndex()

  • createSearchIndexes()

  • listSearchIndexes()

  • updateSearchIndex()

  • dropSearchIndex()

Observação

Os métodos de gerenciamento de índice anteriores são executados de forma assíncrona e podem retornar antes de confirmar que foram executados com êxito. Para determinar o status atual dos índices, chame o método listSearchIndexes().

Você pode usar os métodos createSearchIndex() e createSearchIndexes() para criar um ou mais índices de pesquisa MongoDB ou MongoDB Vector Search. O método createSearchIndexes() aceita uma lista de definições de índice, o que permite criar vários índices em uma chamada e especificar o tipo de índice para cada índice.

O seguinte exemplo de código mostra como criar um índice de pesquisa MongoDB :

val index = Document("mappings" -> Document("dynamic" -> true))
collection.createSearchIndex("<index name>", index)
.subscribe((result: String) => ())

Use o método createSearchIndexes() para criar vários índices de pesquisa do MongoDB ou de pesquisa vetorial do MongoDB.

O exemplo de código a seguir mostra como criar índices de pesquisa MongoDB e pesquisa vetorial em uma chamada:

val searchIdxMdl = SearchIndexModel(
Option("searchIdx"),
Document("analyzer" -> "lucene.standard", "mappings" -> Document("dynamic" -> true)),
Option(SearchIndexType.search())
)
val vectorSearchIdxMdl = SearchIndexModel(
Option("vsIdx"),
Document(
"fields" -> List(
Document("type" -> "vector", "path" -> "embeddings", "numDimensions" -> 1536, "similarity" -> "dotProduct")
)
),
Option(SearchIndexType.vectorSearch())
)
collection.createSearchIndexes(List(searchIdxMdl, vectorSearchIdxMdl))
.subscribe((result: String) => ())

To learn more about the syntax used to define MongoDB Search indexes, see the Index Reference guide in the Atlas manual.

Você pode usar o método listSearchIndexes() para retornar todos os índices de pesquisa do MongoDB Search em uma coleção.

O exemplo de código a seguir mostra como imprimir uma lista dos índices de pesquisa de uma coleção assinando o Observable retornado pelo método listSearchIndexes():

collection.listSearchIndexes()
.subscribe((result: Document) => println(result.toJson()))

Você pode usar o método updateSearchIndex() para atualizar um índice de pesquisa do MongoDB.

O seguinte código mostra como atualizar um índice de pesquisa:

val updateIndex = Document("mappings" -> Document("dynamic" -> false))
collection.updateSearchIndex("<index to update>", updateIndex)
.subscribe((result: Unit) => ())

Você pode usar o método dropSearchIndex() para excluir um índice de pesquisa do MongoDB.

Aviso

A exclusão de índices de pesquisa e clusters é irreversível

Excluir índices de pesquisa e clusters associados é uma ação permanente. O MongoDB não oferece suporte para em recuperação de índice de pesquisa ou dados excluídos. Certifique-se de ter tomado as medidas apropriadas, como a criação de backup, para evitar a perda de dados antes de prosseguir.

O MongoDB não oferece suporte a solicitações para recuperar índice de pesquisa ou dados excluídos. Você é responsável pela integridade e configurações dos dados.

O seguinte código mostra como excluir um índice de pesquisa de uma coleção:

collection.dropSearchIndex("<index name>")
.subscribe((result: Unit) => ())

O exemplo seguinte cria um índice dsphere do 2no campo especificado que contém objetos GeoJSON:

val observable = collection.createIndex(Indexes.geo2dsphere("<2d index>"))
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

For more information on 2dsphere indexes, see the 2dsphere Indexes guide in the MongoDB Server manual.

Para obter mais informações sobre o tipo GeoJSON, consulte o guia Objetos GeoJSON no manual do MongoDB Server .

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

O exemplo a seguir exclui um índice com o nome especificado:

val observable = collection.dropIndex("<index name>")
Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))

Para saber mais sobre os métodos ou objetos usados neste guia, consulte a seguinte documentação da API: