Overview
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 el Index clase, que puedes usar para crear un índice en tu modelo. Django MongoDB Backend crea el mismo índice en tu 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.
Datos de muestra
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
Introducción al tutorial de backend de MongoDB de Django.
Crear un índice
Para crear un índice en tu modelo, especifica la opción indexes en la clase Meta de tu modelo. Establece el valor de esta opción indexes a una lista de los índices que deseas 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.nameEspecifica el nombre del índice. Este argumento es opcional, y Django crea automáticamente un nombre de índice si no proporcionas uno.condition: Especifica un subconjunto de documentos a crear un índice. Este argumento es opcional. Para obtener más información sobre el argumentocondition, 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:
Índice de un solo campo
Los índices de campo único almacenan información de un solo campo en una colección. Por defecto, 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, puedes establecer la opción db_index en el campo title de tu 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)
Índice compuesto
Los índices compuestos recopilan y ordenan datos de varios campos en una colección. MongoDB agrupa los datos por el primer campo especificado en el índice y luego por 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 Backend de MongoDB de Django crea en la colección recipes:
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["title", "cook_time"]), ]
Multikey Index
Los índices multiclave permiten recopilar y organizar datos de campos tipo arreglo. Cuando se crea un índice en un campo tipo arreglo, MongoDB establece automáticamente dicho índice como multiclave.
El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice compuesto en el campo tipo array allergens, que Django MongoDB Backend crea en la colección recipes:
class Meta: db_table = "recipes" indexes = [ models.Index(fields=["allergens"], name="allergy_idx"), ]
Índice de modelos embebidos
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 de 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 sólo 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. Para aprender cómo indexar campos dentro del documento incrustado, consulta la siguiente sección.
Índice de subcampo del modelo integrado
Puedes utilizar la clase EmbeddedFieldIndex para crear índices en subcampos de un modelo incrustado.
Importante
Compatibilidad con índices de subcampos de modelos integrados
Solo puedes crear índices en subcampos de modelos embebidos en Django MongoDB Backend v6.0.2 o posterior.
Para definir el índice de subcampo, asigne la opción indexes en la clase Meta de su modelo de nivel superior a un objeto EmbeddedFieldIndex. Pase el nombre de uno o más subcampos a indexar al constructor EmbeddedFieldIndex().
El siguiente ejemplo crea un índice en el campo calories del modelo incrustado Nutrition modificando la clase Meta del modelo Recipe:
class Meta: db_table = "recipes" indexes = [ EmbeddedFieldIndex(fields=["nutrition.calories"]), ]
Configuración avanzada de índices
Esta sección muestra cómo crear los siguientes tipos de índices avanzados:
Advertencia
Migraciones del índice de búsqueda
Después de que crees un nuevo índice de MongoDB Search o búsqueda vectorial y ejecutes los comandos de migración de la base de datos, Django podría tardar un poco en aplicar las migraciones. Para asegurar la coherencia de los datos, Django bloquea hasta que MongoDB complete la operación de índice. Las migraciones pueden tardar segundos o minutos en completarse, dependiendo del tamaño de tu colección.
Índices de búsqueda
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, asigna la opción indexes en la clase Meta de tu modelo a un objeto SearchIndex. Pasa los siguientes argumentos al constructor SearchIndex() en cualquier orden:
fieldsLos campos que deseas 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 puede pasar los siguientes argumentos a SearchIndex():
field_mappings(Opcional) Un diccionario que asigna nombres de campos a opciones de índices. Puedes utilizar este argumento en lugar defieldspara 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 string durante la indexación. Si no especificas este argumento, MongoDB Server utilizalucene.standardpor defecto.search_analyzer: (Opcional) El analizador que se aplicará al texto de la query. Si no especificas este argumento, su valor es el mismo que el deanalyzer. Si omites ambos argumentos, MongoDB Server utiliza por defectolucene.standard.
Tip
Para obtener más información sobre las consultas e índices de búsqueda de MongoDB, consulte los siguientes recursos:
Referencia de índice de búsqueda en la documentación de Atlas
Search analizadores en la documentación de Atlas
SearchIndex clase en la documentación de la API Backend de Django MongoDB
Ejemplo de índice de búsqueda básica
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", ) ]
Ejemplo de índice de búsqueda avanzada
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:
Índices de búsqueda vectorial.
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, asigna la opción indexes en la clase Meta de tu modelo a un objeto VectorSearchIndex. Pasa los siguientes argumentos al constructor VectorSearchIndex() en cualquier orden:
name: (Opcional) El nombre de tu índice de búsqueda vectorial. Si no especificas este argumento, Django generará automáticamente un nombre de índice.fields: Los campos que desea indexar. Al menos uno debe ser un campo de vectores, representado por un arreglo de valoresFloatFieldoIntegerFieldcon un tamaño.similarities: La función de similitud que se usará. Puede usar la función de similitud"cosine","dotProduct"o"euclidean". Especifique la función como un solo valor de string 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 en 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:
Búsqueda Vectorial en la documentación de Atlas.
Clase VectorSearchIndex en la documentación de la API Backend de Django MongoDB.
Índices parciales
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, pasa 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 utilizar el argumento condition, también debe pasar el argumento name a models.Index().
Tip
Para obtener más información sobre los objetos Q, consulte Q en la documentación de Django.
El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice parcial en el campo cuisine, indicando a Django MongoDB Backend que sólo 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"), ]
Unique Indexes
Los índices únicos te permiten evitar que los campos indexados almacenen valores duplicados. En un único campo, los índices únicos aseguran que un valor aparezca como máximo una vez para el campo especificado. En múltiples campos, los índices únicos garantizan que cualquier combinación dada de los valores clave del índice aparezca como máximo una vez.
Ejemplo de campo único
El siguiente ejemplo actualiza el campo cuisine del modelo Recipe, estableciendo la opción unique en True para crear un índice único de campo único:
cuisine = models.CharField(max_length=200, unique=True)
Nota
Configurar la opción unique en True crea automáticamente un índice en el campo indicado.
Ejemplo compuesto
El siguiente ejemplo actualiza la clase Meta del modelo Recipe para crear un índice compuesto en los campos title y cuisine. El código establece la opción constraints en una instancia de UniqueConstraint, 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
Configurar la opción constraints en un UniqueConstraint crea automáticamente un índice en los campos especificados. Para aprender más sobre la opción constraint de la clase Meta, consulte Restricciones en la documentación de Django.
Información Adicional
Para obtener más información sobre los tipos de índices mencionados en esta guía, consulta los siguientes recursos del manual de MongoDB Server:
Para aprender más sobre cómo crear índices en modelos de Django, consulta Index en la documentación de Django.