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 classe Index , 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 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) 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 tutorialde Introdução ao backend do MongoDB do Django.
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 oconditionargumento, 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 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 Q na documentação do 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 opção constraints para um UniqueConstraint cria automaticamente um índice nos campos especificados. Para saber mais sobre a opção constraint da classe Meta, 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 Index na documentação do Django.