Menu Docs
Página inicial do Docs
/ /
Modele seus dados
/ / /

Crie índices

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

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.

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 o condition 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:

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)

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"]),
]

Í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"),
]

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.

Esta seção mostra como criar os seguintes tipos de índice avançados:

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"),
]

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

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.

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.

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.

Voltar

Modele seus dados

Nesta página