Visão geral
Neste guia, você pode aprender como criar índices MongoDB usando seus modelos Django. Os índices podem melhorar a eficiência das queries e fornecer funcionalidades adicionais de armazenamento de documento e query.
Sem índices, o MongoDB deve digitalizar todos os documento em uma collection para encontrar os documentos que correspondem a uma query. Essas verificações da collection são lentas e podem afetar negativamente o desempenho do seu aplicação. No entanto, se existir um índice apropriado para uma query, o MongoDB poderá usar o índice para limitar os documentos inspecionados.
O Django fornece a classe Index
, que você pode usar para criar um índice em seu modelo. O Django MongoDB Backend cria o mesmo índice em sua coleção MongoDB que o modelo representa.
Dica
Para saber mais sobre a Index
classe , consulte Index
na documentação do Django.
Dados de amostra
Os exemplos neste guia usam o modelo Recipe
, que contém um modelo Nutrition
incorporado como valor de seu campo nutrition
. Essas classes de modelo têm as seguintes definições:
from django.db import models from django.db.models import Q, F from django_mongodb_backend.models import EmbeddedModel from django_mongodb_backend.fields import EmbeddedModelField, ArrayField from django_mongodb_backend.indexes import SearchIndex, VectorSearchIndex class Nutrition(EmbeddedModel): calories = models.IntegerField(default=0) carb_grams = models.IntegerField(default=0) protein_grams = models.IntegerField(default=0) class Recipe(models.Model): title = models.CharField(max_length=200) cuisine = models.CharField(max_length=200) cook_time = models.IntegerField(default=0) allergens = ArrayField(models.CharField(max_length=100), null=True, blank=True) ratings = ArrayField(models.IntegerField(default=0), size=10) nutrition = EmbeddedModelField(Nutrition, null=True, blank=True) class Meta: db_table = "recipes" def __str__(self): return self.title
Na classe Meta
do modelo Recipe
, a opção db_table = "recipes"
instrui o backend do Django MongoDB a mapear o modelo Recipe
para uma collection do MongoDB chamada recipes
. Para saber como criar um aplicação Django que use modelos para interagir com coleções do MongoDB, acesse o tutorial de Introdução.
Crie um índice
Para criar um índice no seu modelo, especifique a opção indexes
na classe Meta
do seu modelo. Defina o valor desta opção indexes
para uma lista dos índices que você deseja criar, conforme mostrado no código a seguir:
class Meta: indexes = [ models.Index(<first index definition>), models.Index(<second index definition>), # add more indexes here ]
Para definir seu índice, passe os seguintes argumentos para o método models.Index()
:
fields
: especifica uma lista de campos para indexar. Este argumento é necessário.name
: especifica o nome do índice. Este argumento é opcional, e o Django cria automaticamente um nome de índice se você não fornecer um.condition
: especifica um subconjunto de documentos para indexar. Este argumento é opcional. Para saber mais sobre ocondition
argumento, consulte a seção Índices parciais deste guia.
Depois de aplicar suas migrações de banco de dados , o Django MongoDB Backend cria os mesmos índices na coleção do MongoDB .
Dica
Para saber como criar e aplicar migrações de banco de dados , consulte Migrações na documentação do Django.
Esta seção mostra como criar os seguintes tipos de índice:
Índice de campo único
Os índices de campo único armazenam informações de um único campo em uma coleção. Por padrão, todas as collections do MongoDB têm um índice no campo _id
.
O exemplo a seguir atualiza a classe Meta
do modelo Recipe
para criar um único índice de campo no campo title
, que o backend do Django MongoDB cria na coleção recipes
:
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["title"], name="title_idx"), ]
Como alternativa, você pode definir a opção db_index
no campo title
do seu modelo para criar o índice, conforme mostrado no código a seguir:
class Recipe(models.Model): title = models.CharField(max_length=200, db_index=True)
Índice composto
Os índices compostos coletam e classificam dados de vários campos em uma collection. O MongoDB agrupa dados pelo primeiro campo especificado no índice e, em seguida, por cada campo subsequente.
O exemplo a seguir atualiza a classe Meta
do modelo Recipe
para criar um índice composto nos campos title
e cook_time
, que o Django MongoDB Backend cria na coleção recipes
:
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["title", "cook_time"]), ]
Multikey Index
Índices de múltiplas chave coletam e classificam dados de campos de array. Quando você cria um índice em um campo de array , o MongoDB define automaticamente esse índice como um índice de várias chaves.
O exemplo a seguir atualiza a classe Meta
do modelo Recipe
para criar um índice composto no campo de array allergens
, que o backend do Django MongoDB cria na coleção recipes
:
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["allergens"], name="allergy_idx"), ]
Índice de documentos incorporado
Você pode criar índices em campos que armazenam valores de modelo incorporados, que o MongoDB representa como documentos incorporados.
O exemplo a seguir atualiza a classe Meta
do modelo Recipe
para criar um índice no campo do modelo incorporado nutrition
, que o backend do Django MongoDB cria na coleção recipes
:
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["nutrition"]), ]
Importante
O índice criado no exemplo anterior é usado somente em queries que especificam todo o documento incorporado. As queries de um campo específico dentro do documento incorporado não usam o índice. No entanto, você pode indexar campos dentro do documento incorporado adicionando uma classe Meta
interna ao modelo Nutrition
e especificando a opção indexes
.
Configuração avançada de índice
Esta seção mostra como criar os seguintes tipos de índice avançados:
Índices de pesquisa do Atlas
Os índices do Atlas Search especificam o comportamento de um Atlas Search, que é uma pesquisa de texto completo em collections hospedadas no MongoDB Atlas.
Para criar um índice do Atlas Search , atribua a opção indexes
na classe Meta
do seu modelo a um objeto SearchIndex
. Passe os seguintes argumentos para o construtor SearchIndex()
:
fields
: Os campos que você deseja indexar.name
: (Opcional) O nome do seu índice do Atlas Search . Se você não especificar este argumento, o Django gerará automaticamente um nome de índice.
O exemplo seguinte atualiza a classe Meta
do modelo Recipe
para criar um índice do Atlas Search denominado "title_search_idx"
no campo title
:
class Meta: db_table = "recipes" indexes = [ SearchIndex( fields=["title"], name="title_search_idx", ) ]
Dica
Para saber mais sobre queries e índices do Atlas Search , consulte os seguintes recursos:
Atlas Search na documentação do Atlas.
classeSearchIndex na documentação da API de backend do MongoDB do Django.
Índices do Atlas Vector Search
Os índices do Atlas Vector Search permitem fazer query de dados com base em seu significado semântica, e não por correspondências de palavras-chave. Você pode integrar a pesquisa vetorial com queries de pesquisa de texto completo e frameworks de IA para dar suporte a uma variedade de casos de uso.
Para criar um índice de pesquisa vetorial, atribua a opção indexes
na classe Meta
do seu modelo a um objeto VectorSearchIndex
. Passe os seguintes argumentos para o construtor VectorSearchIndex()
:
name
: (Opcional) O nome do seu índice do Atlas Vector Search . Se você não especificar este argumento, o Django gerará automaticamente um nome de índice.fields
: Os campos que você deseja indexar. Pelo menos um deve ser um campo de vetor , representado por uma array deFloatField
ouIntegerField
valores com um tamanho.similarities
: a função de similaridade a ser usada. Você pode usar a função de similaridade"cosine"
,"dotProduct"
ou"euclidean"
. Especifique a função como um único valor de string ou uma lista de valores que atribui funções a campos de vetor individuais.
O exemplo seguinte atualiza a classe Meta
do modelo Recipe
para criar um índice de pesquisa vetorial denominado "vector_search_idx"
no campo vetorial ratings
e no campo numérico cook_time
:
class Meta: db_table = "recipes" indexes = [ VectorSearchIndex( name=["vector_search_idx"], fields=["ratings", "cook_time"], similarities=["cosine", "euclidean"], ) ]
Dica
Para saber mais sobre queries e índices do Atlas Vector Search , consulte os seguintes recursos:
Atlas Vector Search na documentação do Atlas.
classeVectorSearchIndex na documentação da API do Django MongoDB Backend.
Índices Parciais
Os índices parciais indexam apenas os documentos em uma collection que atendem aos critérios de filtro especificados, o que reduz o uso de armazenamento e os custos de desempenho.
Para criar um índice parcial, passe o argumento condition
para o método models.Index()
. Defina o valor da condição como um objeto Q
que inclua os critérios de filtro. Ao usar o argumento condition
, você também deve passar o argumento name
para models.Index()
.
Dica
Para saber mais sobre Q
objetos, consulte na documentação do Q
Django.
O exemplo a seguir atualiza a classe Meta
do modelo Recipe
para criar um índice parcial no campo cuisine
, instruindo o Backend do Django MongoDB a indexar apenas documentos que tenham um valor cook_time
menor que 30
:
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["cuisine"], condition=Q(cook_time__lt=30), name="fast_cuisine_idx"), ]
Unique Indexes
Índices únicos permitem evitar que campos indexados armazenem valores duplicados. Em um único campo, índices únicos garantem que um valor apareça , no máximo , uma vez no campo especificado . Em vários campos, índices únicos garantem que qualquer combinação dos valores de chave de índice apareça no máximo uma vez.
Exemplo de Campo Único
O exemplo seguinte atualiza o campo cuisine
do modelo Recipe
, definindo a opção unique
como True
para criar um índice único de campo único:
cuisine = models.CharField(max_length=200, unique=True)
Observação
Definir a opção unique
como True
cria automaticamente um índice no campo fornecido.
Exemplo composto
O exemplo seguinte atualiza a classe Meta
do modelo Recipe
para criar um índice composto nos campos title
e cuisine
. O código define a opção constraints
para uma instância UniqueConstraint
, que cria um índice composto único nestes campos:
class Meta: db_table = "recipes" constraints = [ models.UniqueConstraint(fields=["title", "cuisine"], name="unique_regional_meal"), ]
Dica
Configurar a constraints
opção para um UniqueConstraint
cria automaticamente um índice nos campos especificados. Para saber mais sobre a Meta
constraint
opção da classe,consulte Restrições na documentação do Django.
Informações adicionais
Para saber mais sobre os tipos de índice mencionados neste guia, consulte os seguintes recursos manuais do MongoDB Server :
Para saber mais sobre como criar índices nos modelos Django, consulte na documentação do Index
Django.