Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Backend do Django MongoDB
/

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

Para saber mais sobre a Index classe , consulte Index na documentação do Django.

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.

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

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 de FloatField ou IntegerField 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:

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

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

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.

Voltar

Modele seus dados

Nesta página