Indexes
Nesta página
- Visão geral
- Considerações operacionais
- Dados de amostra
- Tipos de índice
- Campo único e índices compostos
- Índices de várias teclas (índices em campos de array)
- Atlas Search e índices de Vector Search
- Text Indexes
- Índices geoespaciais
- Unique Indexes
- Índices curinga
- Índices aglomerados
- Remover um Índice
- Remover um único índice
- Remover todos os índices
- Solução de problemas
- DuplicateKeyException
- Informações adicionais
- Documentação da API
Visão geral
Neste guia, você pode aprender como usar índices com o PyMongo. Os índices podem melhorar a eficiência das queries e adicionar funcionalidades à consulta e ao armazenamento de documentos.
Sem índices, o MongoDB deve digitalizar todos os documentos em uma 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. No entanto, se existir um índice apropriado para uma query, o MongoDB poderá usar o índice para limitar os documentos que deve inspecionar.
Considerações operacionais
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 adicionado consome espaço em disco e memória quando ativo, portanto, recomendamos que você rastreie 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 atualiza o índice relacionado.
Como o MongoDB oferece suporte a esquemas dinâmicos, os aplicativos podem executar consulta dos campos cujos nomes não são 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 volume de trabalho.
Para obter mais informações sobre como projetar seu modelo de dados e escolher os índices apropriados para seu aplicação, consulte o guia Modelagem de dados e índices no manual do MongoDB Server .
Dados de amostra
Os exemplos neste guia usam a collection sample_mflix.movies
dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte a Introdução ao PyMongo.
Tipos de índice
Campo único e índices compostos
Índices de campo único
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
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
movies.create_index("title")
await movies.create_index("title")
O seguinte é um exemplo de uma consulta coberta pelo índice criado no exemplo de código anterior:
query = { "title": "Batman" } sort = [("title", 1)] cursor = movies.find(query).sort(sort)
Para saber mais, consulte Índices de campo único no manual do MongoDB Server .
Índices compostos
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.
O exemplo seguinte cria um índice composto nos campos type
e genre
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
movies.create_index([("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)])
await movies.create_index([("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)])
O seguinte é um exemplo de uma consulta que utiliza o índice criado no exemplo de código anterior:
query = { "type": "movie", "genre": "Drama" } sort = [("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)] cursor = movies.find(query).sort(sort)
Para obter mais informações, consulte Índices compostos no manual do MongoDB Server.
Índices de várias teclas (índices em campos de array)
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. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
O exemplo seguinte cria um índice de múltiplas chaves no campo cast
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
result = movies.create_index("cast")
result = await movies.create_index("cast")
O seguinte é um exemplo de uma consulta que utiliza o índice criado no exemplo de código anterior:
query = { "cast": "Viola Davis" } cursor = movies.find(query)
Os índices multicamadas se comportam de forma diferente de outros índices em termos de cobertura de query, computação vinculada a índice e comportamento de classificação. Para saber mais sobre índices de várias chaves, incluindo uma discussão sobre seu comportamento e limitações, consulte o guia Índices de várias chaves no manual do MongoDB Server.
Atlas Search e índices de Vector Search
Você pode gerenciar seus índices do Atlas Search e Atlas Vector Search usando o PyMongo. Os índices especificam o comportamento da busca e quais campos indexar.
O Atlas Search permite realizar pesquisas de texto completo em coleções hospedadas no MongoDB Atlas. Os índices do Atlas Search especificam o comportamento da pesquisa e quais campos indexar.
O Atlas Vector Search permite que você realize pesquisas semânticas em incorporações vetoriais armazenadas no MongoDB Atlas. Os índices de pesquisa de vetores definem os índices para as incorporações vetoriais nas quais você deseja fazer query e os valores booleanos, de data, objectId, numéricos, de string ou UUID que você deseja usar para pré-filtrar seus dados.
Você pode chamar os seguintes métodos em uma coleção para gerenciar seus índices Atlas Search e Vector Search :
create_search_index()
create_search_indexes()
list_search_indexes()
update_search_index()
drop_search_index()
Observação
Os métodos de gerenciamento do Atlas Search Index são executados de forma assíncrona. Os métodos do driver podem ser gerados antes de confirmar que foram executados corretamente. Para determinar o status atual dos índices, chame o método list_search_indexes()
.
As seções a seguir fornecem exemplos de código que demonstram como usar cada um dos métodos anteriores.
Criar um índice de pesquisa
Você pode usar os métodos create_search_index() e create_search_indexes() para criar índices do Atlas Search ou índices do Atlas Vector Search.
O seguinte exemplo de código mostra como criar um único índice do Atlas Search . Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
index = { "definition": { "mappings": { "dynamic": True } }, "name": "<index name>", } collection.create_search_index(index)
index = { "definition": { "mappings": { "dynamic": True } }, "name": "<index name>", } await collection.create_search_index(index)
O seguinte exemplo de código mostra como criar um único índice do Atlas Vector Search usando o objeto SearchIndexModel. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
from pymongo.operations import SearchIndexModel search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "numDimensions": <number of dimensions>, "path": "<field to index>", "similarity": "<select from euclidean, cosine, dotProduct>" } ] }, name="<index name>", type="vectorSearch", ) collection.create_search_index(model=search_index_model)
from pymongo.operations import SearchIndexModel search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "numDimensions": <number of dimensions>, "path": "<field to index>", "similarity": "<select from euclidean, cosine, dotProduct>" } ] }, name="<index name>", type="vectorSearch", ) await collection.create_search_index(model=search_index_model)
Você pode usar o método create_search_indexes() para criar múltiplos índices. Esses índices podem ser índices do Atlas Search ou do Vector Search. O método create_search_indexes()
usa uma lista de objetos SearchIndexModel
que correspondem a cada índice que você deseja criar.
O seguinte exemplo de código mostra como criar um índice do Atlas Search e um índice do Atlas Vector Search . Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
search_idx = SearchIndexModel( definition ={ "mappings": { "dynamic": True } }, name="my_index", ) vector_idx = SearchIndexModel( definition={ "fields": [ { "type": "vector", "numDimensions": <number of dimensions>, "path": "<field to index>", "similarity": "<select from euclidean, cosine, dotProduct>" } ] }, name="my_vector_index", type="vectorSearch", ) indexes = [search_idx, vector_idx] collection.create_search_indexes(models=indexes)
search_idx = SearchIndexModel( definition ={ "mappings": { "dynamic": True } }, name="my_index", ) vector_idx = SearchIndexModel( definition={ "fields": [ { "type": "vector", "numDimensions": <number of dimensions>, "path": "<field to index>", "similarity": "<select from euclidean, cosine, dotProduct>" } ] }, name="my_vector_index", type="vectorSearch", ) indexes = [search_idx, vector_idx] await collection.create_search_indexes(models=indexes)
Listar índices de pesquisa
Você pode usar o método list_search_indexes() para obter informações sobre os índices do Atlas Search e do Vector Search de uma coleção.
O seguinte exemplo de código mostra como imprimir uma lista dos índices de pesquisa de uma coleção. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
results = list(collection.list_search_indexes()) for index in results: print(index)
results = await (await collection.list_search_indexes()).to_list() async for index in results: print(index)
Atualizar um Índice de Pesquisa
Você pode usar o método update_search_index() para atualizar um índice do Atlas Search ou do Vector Search.
O seguinte exemplo de código mostra como atualizar um índice de Atlas Search . Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
new_index_definition = { "mappings": { "dynamic": False } } collection.update_search_index("my_index", new_index)
O seguinte exemplo de código mostra como atualizar um índice do Atlas Vector Search . Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
new_index_definition = { "fields": [ { "type": "vector", "numDimensions": 1536, "path": "<field to index>", "similarity": "euclidean" }, ] } collection.update_search_index("my_vector_index", new_index_definition)
new_index_definition = { "fields": [ { "type": "vector", "numDimensions": 1536, "path": "<field to index>", "similarity": "euclidean" }, ] } await collection.update_search_index("my_vector_index", new_index_definition)
Excluir um índice de pesquisa
Você pode usar o método drop_search_index() para remover um índice do Atlas Search ou do Vector Search.
O seguinte código mostra como excluir um índice de pesquisa de uma coleção. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
collection.drop_search_index("my_index")
await collection.drop_search_index("my_index")
Text Indexes
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
O MongoDB oferece uma solução aprimorada de pesquisa de texto completo, o Atlas Search. Para saber mais sobre os índices do Atlas Search e como usá-los, consulte a seção Índices do Atlas Search e Vector Search nesta página.
Índice de texto em um campo único
O exemplo seguinte cria um índice de texto no campo plot
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
movies.create_index( [( "plot", "text" )] )
await movies.create_index( [( "plot", "text" )] )
O seguinte é um exemplo de uma consulta que utiliza o índice criado no exemplo de código anterior:
query = { "$text": { "$search": "a time-traveling DeLorean" } } cursor = movies.find(query)
Índice de texto em vários campos
Uma collection pode conter somente um índice de texto. Se você deseja criar um índice de texto para múltiplos campos de texto, crie um índice composto. Uma pesquisa de texto é executada em todos os campos de texto dentro do índice composto.
O exemplo seguinte cria um índice de texto composto para os campos title
e genre
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
from pymongo.collation import Collation result = myColl.create_index( [("title", "text"), ("genre", "text")], default_language="english", weights={ "title": 10, "genre": 3 }, collation=Collation(locale='fr_CA') )
from pymongo.collation import Collation result = await myColl.create_index( [("title", "text"), ("genre", "text")], default_language="english", weights={ "title": 10, "genre": 3 }, collation=Collation(locale='fr_CA') )
Para obter mais informações, consulte Restrições do índice de texto composto e Índices de texto no manual do MongoDB Server .
Índices geoespaciais
O MongoDB suporta queries de dados de coordenadas geoespaciais utilizando índices 2dsphere. Com um índice do 2dsphere
, você pode executar query de inclusão, interseção e proximidade nos dados geoespaciais. Para obter mais informações sobre query de dados geoespaciais, consulte a página Queries em dados geoespaciais.
Para criar um índice do 2dsphere
, você deve especificar um campo que contém somente Objetos GeoJSON. Para obter mais detalhes sobre este tipo, consulte o guia ObjetosGeoJSON no manual do MongoDB Server .
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 ] } } }
Criar um índice geoespacial
O seguinte exemplo cria um índice 2dsphere
no campo location.geo
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
theaters.create_index( [( "location.geo", "2dsphere" )] )
await theaters.create_index( [( "location.geo", "2dsphere" )] )
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 mais informações, consulte o guia de queries geoespaciais no manual do MongoDB Server .
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 collection. Para criar um índice único, execute as seguintes etapas:
Especifique o campo ou a combinação de campos em que você deseja evitar a duplicação.
Defina a opção
unique
como ''True''.
Criar um índice único
O exemplo seguinte cria um índice único descendente no campo theaterId
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
theaters.create_index("theaterId", unique=True)
await theaters.create_index("theaterId", unique=True)
Para obter mais informações, consulte o guia Índices únicos no manual do MongoDB Server .
Índices curinga
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.
Criar um Índice Curinga
O exemplo seguinte cria um índice curinga ascendente em todos os valores do campo location
, incluindo valores aninhados em subdocumentos e arrays. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
movies.create_index({ "location.$**": pymongo.ASCENDING })
await movies.create_index({ "location.$**": pymongo.ASCENDING })
Para obter mais informações, consulte a página Índices curinga no manual do MongoDB Server.
Índices aglomerados
Os índices de cluster instruem a collection a armazenar documentos ordenados por um valor de chave. Para criar um índice clusterizado, execute as seguintes etapas ao criar sua collection:
Especifique a opção de índice clusterizado com o campo
_id
como a chave.Defina o campo exclusivo como
True
.
Criar um índice clusterizado
O exemplo seguinte cria um índice agrupado no campo _id
em uma nova coleção movie_reviews
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
sample_mflix.create_collection("movies", clusteredIndex={ "key": { "_id": 1 }, "unique": True })
await sample_mflix.create_collection("movies", clusteredIndex={ "key": { "_id": 1 }, "unique": True })
Para obter mais informações, consulte as seções Índice agrupado e Coleções agrupadas no manual do MongoDB Server .
Remover um Índice
Você pode remover qualquer índice não utilizado, exceto o índice exclusivo padrão no campo _id
.
As seções a seguir mostram como remover um único índice ou todos os índices de uma coleção.
Remover um único índice
Passe uma instância de um índice ou o nome do índice para o método drop_index()
para remover um índice de uma coleção.
O exemplo a seguir remove um índice com o nome "_title_"
da coleção movies
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
movies.drop_index("_title_")
await movies.drop_index("_title_")
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.
Remover todos os índices
A partir do MongoDB 4.2, você pode soltar todos os índices ligando para o método drop_indexes()
em sua coleção. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
collection.drop_indexes()
await collection.drop_indexes()
Para versões anteriores do MongoDB, passe "*"
como parâmetro para sua chamada para drop_index()
em sua collection:
collection.drop_index("*")
await collection.drop_index("*")
Solução de problemas
DuplicateKeyException
Se você executar uma operação de gravação que armazena um valor duplicado que viola um índice exclusivo, o driver gera uma DuplicateKeyException
e o MongoDB lança um erro semelhante ao seguinte:
E11000 duplicate key error index
Informações adicionais
Para saber mais sobre índices no MongoDB, consulte o guia Índices no manual do MongoDB Server .
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: