Docs Menu
Docs Home
/ /
/ / /

Cree índices

En esta guía, aprenderá a crear índices de MongoDB con sus modelos de Django. Los índices pueden mejorar la eficiencia de las consultas y proporcionar funcionalidad adicional para el almacenamiento de consultas y documentos.

Sin índices, MongoDB debe escanear cada documento de una colección para encontrar los documentos que coinciden con una query. Estos escaneos de colección son lentos y pueden afectar negativamente el rendimiento de tu aplicación. Sin embargo, si existe un índice adecuado para una query, MongoDB puede usar el índice para limitar los documentos que inspecciona.

Django proporciona la Index Clase que permite crear un índice en el modelo. El backend de Django MongoDB crea el mismo índice en la colección MongoDB que representa el modelo.

Tip

Para obtener más información sobre la clase Index, consulte Index en la documentación de Django.

Los ejemplos de esta guía utilizan el modelo Recipe, que contiene un modelo Nutrition incrustado como valor de su campo nutrition. Estas clases modelo tienen las siguientes definiciones:

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

En la clase Meta del modelo Recipe, la opción db_table = "recipes" indica al backend de Django MongoDB que asigne el modelo Recipe a una colección de MongoDB llamada recipes. Para aprender a crear una aplicación Django que use modelos para interactuar con colecciones de MongoDB, visite Tutorial de introducción.

Para crear un índice en su modelo, especifique la opción indexes en la clase Meta de su modelo. Establezca el valor de esta opción indexes en una lista de los índices que desea crear, como se muestra en el siguiente código:

class Meta:
indexes = [
models.Index(<first index definition>),
models.Index(<second index definition>),
# add more indexes here
]

Para definir su índice, pase los siguientes argumentos al método models.Index():

  • fields: Especifica una lista de campos para indexar. Este argumento es obligatorio.

  • name: Especifica el nombre del índice. Este argumento es opcional y Django crea automáticamente un nombre de índice si no se proporciona uno.

  • condition: Especifica un subconjunto de documentos a crear un índice. Este argumento es opcional. Para obtener más información sobre el argumento condition, consulta la sección Índices parciales de esta guía.

Después de aplicar las migraciones de su base de datos, Django MongoDB Backend crea los mismos índices en la colección MongoDB.

Tip

Para aprender cómo crear y aplicar migraciones de bases de datos, consulte Migraciones en la documentación de Django.

Esta sección muestra cómo crear los siguientes tipos de índice:

Los índices de campo único almacenan información de un solo campo en una colección. De forma predeterminada, todas las colecciones de MongoDB tienen un índice en el campo _id.

El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice de campo único en el campo title, que Django MongoDB Backend crea en la colección recipes:

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["title"], name="title_idx"),
]

Alternativamente, puede configurar la opción db_index en el campo title de su modelo para crear el índice, como se muestra en el siguiente código:

class Recipe(models.Model):
title = models.CharField(max_length=200, db_index=True)

Los índices compuestos recopilan y ordenan datos de varios campos de una colección. MongoDB agrupa los datos según el primer campo especificado en el índice y, a continuación, según cada campo subsiguiente.

El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice compuesto en los campos title y cook_time, que Django MongoDB Backend crea en la colección recipes:

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["title", "cook_time"]),
]

Los índices multiclave recopilan y ordenan datos de campos de matriz. Al crear un índice en un campo de matriz, MongoDB lo define automáticamente como multiclave.

El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice compuesto en el campo de matriz allergens, que Django MongoDB Backend crea en la colección recipes:

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["allergens"], name="allergy_idx"),
]

Puede crear índices en campos que almacenan valores de modelos integrados, que MongoDB representa como documentos integrados.

El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice en el campo del modelo incrustado nutrition, que Django MongoDB Backend crea en la colección recipes:

class Meta:
db_table = "recipes"
indexes = [
models.Index(fields=["nutrition"]),
]

Importante

El índice creado en el ejemplo anterior solo se utiliza en consultas que especifican todo el documento incrustado. Las consultas sobre un campo específico dentro del documento incrustado no utilizan el índice. Sin embargo, puede indexar campos dentro del documento incrustado añadiendo una clase interna Meta al modelo Nutrition y especificando la opción indexes.

Esta sección muestra cómo crear los siguientes tipos de índices avanzados:

Advertencia

Migraciones del índice de búsqueda

Tras crear un nuevo índice de búsqueda MongoDB o de búsqueda vectorial y ejecutar los comandos de migración de la base de datos, Django podría tardar un tiempo en aplicar las migraciones. Para garantizar la consistencia de los datos, Django bloquea la ejecución hasta que MongoDB complete la operación de indexación. Las migraciones pueden tardar segundos o minutos en completarse, según el tamaño de la colección.

Los índices de búsqueda de MongoDB especifican el comportamiento de una consulta de búsqueda de MongoDB, que es una búsqueda de texto completo en sus colecciones de MongoDB.

Para crear un índice de búsqueda, asigne la opción indexes de la clase Meta de su modelo a un objeto SearchIndex. Pase los siguientes argumentos al constructor SearchIndex() en cualquier orden:

  • fields:Los campos que desea indexar.

  • name: (Opcional) El nombre de tu índice de búsqueda. Si no especifica este argumento, Django genera automáticamente un nombre para el índice.

A partir de Django MongoDB Backend v5.2.2, también puedes pasar los siguientes argumentos a SearchIndex():

  • field_mappings: (Opcional) Un diccionario que asigna nombres de campo a opciones de índice. Puede usar este argumento en lugar de fields para crear un índice de búsqueda complejo que especifique el comportamiento del índice para campos individuales.

  • analyzer: (Opcional) El analizador que se aplicará a los campos de cadena durante la indexación. Si no se especifica este argumento, MongoDB Server toma como valor lucene.standard predeterminado.

  • search_analyzer: (Opcional) El analizador que se aplicará al texto de la consulta. Si no especifica este argumento, su valor será el mismo que el analyzer de. Si omite ambos argumentos, MongoDB Server toma lucene.standard como valor predeterminado.

Tip

Para obtener más información sobre las consultas e índices de búsqueda de MongoDB, consulte los siguientes recursos:

El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice de búsqueda básico llamado "title_search_idx" en el campo title:

class Meta:
db_table = "recipes"
indexes = [
SearchIndex(
fields=["title"],
name="title_search_idx",
)
]

El siguiente ejemplo crea un índice de búsqueda que indexa el campo cuisine como tipo token y establece el analizador en lucene.simple:

class Meta:
db_table = "recipes"
indexes = [
SearchIndex(
name="cuisine_search_idx",
field_mappings={
"cuisine": {
"type": "token"
}
},
analyzer="lucene.simple"
)
]

Tip

Para aprender más sobre la configuración del índice de búsqueda en el ejemplo anterior, consulta los siguientes recursos de la documentación de Atlas:

Los índices de búsqueda vectorial de MongoDB permiten consultar datos basándose en su significado semántico, en lugar de por coincidencias de palabras clave. Es posible integrar la búsqueda vectorial con consultas de texto completo y frameworks de IA para una variedad de casos de uso.

Para crear un índice de búsqueda vectorial, asigne la opción indexes de la clase Meta de su modelo a un objeto VectorSearchIndex. Pase los siguientes argumentos al constructor VectorSearchIndex() en cualquier orden:

  • name: (Opcional) El nombre de su índice de búsqueda vectorial. Si no especifica este argumento, Django genera automáticamente un nombre de índice.

  • fieldsLos campos que desea indexar. Al menos uno debe ser un campo vectorial, representado por una matriz de FloatField IntegerField valores o con un tamaño.

  • similaritiesLa función de similitud que se utilizará. Puede usar las "cosine" "dotProduct" "euclidean" funciones de similitud, o. Especifique la función como un valor de cadena único o una lista de valores que asigne funciones a campos vectoriales individuales.

El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice de búsqueda vectorial llamado "vector_search_idx" en el campo vectorial ratings y el campo numérico cook_time:

class Meta:
db_table = "recipes"
indexes = [
VectorSearchIndex(
name=["vector_search_idx"],
fields=["ratings", "cook_time"],
similarities=["cosine", "euclidean"],
)
]

Tip

Para obtener más información sobre las consultas e índices de Vector Search, consulte los siguientes recursos:

Los índices parciales indexan únicamente los documentos de una colección que cumplen criterios de filtro específicos, lo que reduce el uso de almacenamiento y los costos de rendimiento.

Para crear un índice parcial, pase el argumento condition al método models.Index(). Establezca el valor de la condición en un objeto Q que incluya los criterios de filtro. Al usar el argumento condition, también debe pasar el argumento name a models.Index().

Tip

Para obtener más información sobre Q los objetos, consulte en la documentación de Q Django.

El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice parcial en el campo cuisine, lo que indica a Django MongoDB Backend que solo indexe los documentos que tengan un 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"),
]

Los índices únicos permiten evitar que los campos indexados almacenen valores duplicados. En un solo campo, los índices únicos garantizan que un valor aparezca como máximo una vez para el campo especificado. En varios campos, los índices únicos garantizan que cualquier combinación de valores de clave de índice aparezca como máximo una vez.

El siguiente ejemplo actualiza el campo cuisine del modelo Recipe y establece la opción unique en True para crear un índice de campo único:

cuisine = models.CharField(max_length=200, unique=True)

Nota

Establecer la opción unique en True crea automáticamente un índice en el campo indicado.

El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice compuesto en los campos title y cuisine. El código asigna la opción constraints a una instancia UniqueConstraint, lo que crea un índice compuesto único en estos campos:

class Meta:
db_table = "recipes"
constraints = [
models.UniqueConstraint(fields=["title", "cuisine"],
name="unique_regional_meal"),
]

Tip

Al establecer la constraints opción UniqueConstraint en, se crea automáticamente un índice en los campos especificados. Para obtener más información sobre la Meta constraint opción de la clase,consulte Restricciones en la documentación de Django.

Para obtener más información sobre los tipos de índice mencionados en esta guía, consulte los siguientes recursos del manual de MongoDB Server:

Para obtener más información sobre la creación de índices en modelos de Django, consulte Index en la documentación de Django.

Volver

Modele sus datos

En esta página