Docs Menu
Docs Home
/ /
/ / /

Especifica un query

En esta guía, puede aprender a utilizar Django MongoDB Backend para especificar una consulta de base de datos.

Puede refinar el conjunto de documentos que una query retorna creando un filtro de query. Un filtro de query es una expresión que especifica los criterios de búsqueda que MongoDB utiliza para emparejar documentos en una operación de lectura o escritura. En un filtro de query, puede solicitar que Django MongoDB Backend realice una búsqueda de documentos que coincidan exactamente con su query, o puede componer filtros de query para expresar criterios de coincidencia más complejos.

El Django QuerySet La API proporciona métodos que permiten recuperar objetos del modelo. Para ejecutar una consulta a la base de datos MongoDB, invoque los métodos QuerySet en el administrador de su modelo. La clase Manager gestiona las operaciones de la base de datos y permite interactuar con los datos de MongoDB haciendo referencia a los modelos de Django. Por defecto, Django añade un Manager llamado objects a cada clase del modelo.

Al asignar un QuerySet a una variable, Django MongoDB Backend no realiza la operación hasta que se evalúa la variable. Tras evaluar el QuerySet, Django guarda los resultados de la consulta en la caché QuerySet. Las futuras evaluaciones del QuerySet utilizan los resultados almacenados en caché.

Tip

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

Los ejemplos de esta guía utilizan el Movie modelo, que representa la sample_mflix.movies colección de los conjuntos de datos de muestra de Atlas. El Movie modelo contiene un Award modelo integrado como valor de su awards campo. Estas clases de modelo tienen las siguientes definiciones:

from django.db import models
from django_mongodb_backend.models import EmbeddedModel
from django_mongodb_backend.fields import EmbeddedModelField, ArrayField
class Award(EmbeddedModel):
wins = models.IntegerField(default=0)
nominations = models.IntegerField(default=0)
text = models.CharField(max_length=100)
class Movie(models.Model):
title = models.CharField(max_length=200)
plot = models.TextField(blank=True)
runtime = models.IntegerField(default=0)
released = models.DateTimeField("release date", null=True, blank=True)
awards = EmbeddedModelField(Award)
genres = ArrayField(models.CharField(max_length=100), null=True, blank=True)
imdb = models.JSONField(null=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title

El modelo Movie incluye una clase interna Meta, que especifica los metadatos del modelo, y un método __str__(), que define la representación de cadena del modelo. Para obtener más información sobre estas características del modelo, consulte Defina un modelo en la guía Crear modelos.

Puedes usar el shell interactivo de Python para ejecutar los ejemplos de código. Para acceder al shell, ejecuta el siguiente comando desde el directorio raíz de tu proyecto:

python manage.py shell

Después de ingresar al shell de Python, asegúrese de importar los siguientes modelos y módulos:

from <your application name>.models import Movie, Award
from django.utils import timezone
from datetime import datetime

Para aprender a crear una aplicación Django que use el Movie modelo y el shell interactivo de Python para interactuar con documentos MongoDB, visita el tutorial Primeros pasos.

Para consultar sus datos de MongoDB, llame a un método QuerySet en el administrador de su modelo y especifique sus criterios de coincidencia en un filtro de consulta.

Esta sección describe cómo utilizar los siguientes métodos de la API QuerySet:

Para recuperar todos los documentos de una colección, llame al método all() en el administrador de su modelo.

El siguiente ejemplo llama al método all() para recuperar todos los documentos de la colección sample_mflix.movies:

Movie.objects.all()
<QuerySet [<Movie: The Great Train Robbery>, <Movie: A Corner in Wheat>,
<Movie: Winsor McCay, the Famous Cartoonist of the N.Y. Herald and His Moving Comics>,
<Movie: Traffic in Souls>, <Movie: Gertie the Dinosaur>,
<Movie: In the Land of the Head Hunters>, <Movie: The Perils of Pauline>,
<Movie: The Italian>, <Movie: Regeneration>, <Movie: Civilization>,
'...(remaining elements truncated)...']>

Para consultar una colección en busca de documentos que coincidan con un conjunto de criterios, llama al método filter() en el administrador del modelo. Pasa un filtro de query al método filter() que especifique los criterios de tu query.

El siguiente ejemplo llama al método filter() para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor runtime de 300:

Movie.objects.filter(runtime=300)
<QuerySet [<Movie: Wild Palms>, <Movie: Streets of Laredo>,
<Movie: The Way We Live Now>]>

Para recuperar un documento de una colección, llame al método get() en el administrador de su modelo. Pase un filtro de consulta al método get() que especifique sus criterios de consulta.

Importante

Si su consulta no encuentra ningún documento o encuentra varios, el get() método genera un error. Para recuperar un documento de una consulta que podría encontrar varios, utilice el método first().

El siguiente ejemplo llama al método get() para recuperar un documento que tiene un valor title de "Finding Nemo":

Movie.objects.get(title="Finding Nemo")
<Movie: Finding Nemo>

Para consultar una colección en busca de documentos que no cumplan con sus criterios de búsqueda, llame al método exclude() en el administrador de su modelo. Pase los criterios de exclusión como argumento al método exclude().

El siguiente ejemplo llama al método exclude() para excluir de los resultados los documentos publicados antes del datetime(1980, 1, 1) (enero 1, 1980):

Movie.objects.exclude(released__lt=timezone.make_aware(datetime(1980, 1, 1)))
<QuerySet [<Movie: The Iron Horse>, <Movie: Le grand jeu>,
<Movie: The Devil Is a Woman>, <Movie: Children in the Wind>,
<Movie: Too Much Johnson>, <Movie: Dots>, <Movie: The Blood of Jesus>,
<Movie: The Land>, <Movie: The Brothers and Sisters of the Toda Family>,
<Movie: Begone Dull Care>, '...(remaining elements truncated)...']>

Tip

El ejemplo anterior utiliza la búsqueda en campo lt para query la colección. Para obtener más información sobre las búsquedas de comparación, consulta la sección Usar búsquedas de comparación de esta guía.

Si desea ejecutar consultas complejas que la API de consultas de Django no admite, puede usar el método raw_aggregate(). Este método le permite especificar los criterios de consulta en una canalización de agregación de MongoDB, que se pasa como argumento a raw_aggregate().

Para aprender a ejecutar consultas de base de datos sin procesar, consulte la guía Realizar consultas de base de datos sin procesar.

Puede refinar aún más sus criterios de consulta mediante una búsqueda de campo en su filtro de consulta. Las búsquedas de campo le permiten aclarar la relación entre el campo que está consultando y el valor que desea consultar. Utilice la siguiente sintaxis para especificar una búsqueda de campo:

Model.objects.filter(<field name>__<lookup type>=<value>)

Puede utilizar diferentes tipos de búsqueda para realizar consultas avanzadas, como coincidencia de texto parcial, consultas de elementos de matriz, coincidencia de expresiones regulares y coincidencia de valores de año para campos de fecha y hora.

Tip

Para ver una lista completa de tipos de búsqueda, consulte Búsquedas de campo en la referencia de la QuerySet API de Django.

En esta sección se describe cómo refinar los filtros de consulta de las siguientes maneras:

En la siguiente tabla se describen algunos de los tipos de búsqueda que puede utilizar para ejecutar consultas que incluyan criterios de coincidencia específicos para valores de texto:

Tipo de búsqueda
Descripción

exact

Specifies an exact text match. If you do not provide a lookup type in your query filter, Django MongoDB Backend uses this type by default.
You can specify a case-insensitive exact text match by using iexact.

contains

Specifies a partial text match.
You can specify a case-insensitive partial text match by using icontains.

startswith

Matches field values that begin with the specified text.
You can specify a case-insensitive partial text match by using istartswith.

endswith

Matches field values that end with the specified text.
You can specify a case-insensitive partial text match by using iendswith.

El siguiente ejemplo utiliza la búsqueda contains para consultar documentos en los que el valor plot incluye el texto "coming-of-age":

Movie.objects.filter(plot__contains="coming-of-age")
<QuerySet [<Movie: Murmur of the Heart>, <Movie: Desert Bloom>,
<Movie: Girls Town>, <Movie: Get Real>, <Movie: Man of Steel>,
<Movie: The Holy Land>, <Movie: Secondhand Lions>, <Movie: How to Be Louise>,
<Movie: Mouth to Mouth>, <Movie: Che ne sarè di noi>, <Movie: Roll Bounce>,
'...(remaining elements truncated)...']>

En la siguiente tabla se describen algunos de los tipos de búsqueda que puede utilizar para ejecutar consultas que evalúen un valor de campo frente a un valor especificado:

Tipo de búsqueda
Descripción

gt

Matches field values that are greater than the specified value.

gte

Matches field values that are greater than or equal to the specified value.

lt

Matches field values that are less than the specified value.

lte

Matches field values that are less or equal to than the specified value.

El siguiente ejemplo utiliza la búsqueda lte para consultar documentos en los que el valor runtime sea menor o igual a 50:

Movie.objects.filter(runtime__lte=50)
<QuerySet [<Movie: The Great Train Robbery>, <Movie: A Corner in Wheat>,
<Movie: Winsor McCay, the Famous Cartoonist of the N.Y. Herald and His Moving Comics>,
<Movie: Gertie the Dinosaur>, <Movie: From Hand to Mouth>,
<Movie: High and Dizzy>, <Movie: One Week>, <Movie: Now or Never>,
'...(remaining elements truncated)...']>

Puede ejecutar queries que utilicen varios conjuntos de criterios de coincidencia de las siguientes maneras:

  • Pase varios filtros de consulta a su método de consulta, separados por comas. Para ver un ejemplo, consulte Recuperación de objetos en la documentación de Django.

  • Encadenar métodos de consulta. Para obtener más información, consulte Encadenamiento de filtros en la documentación de Django.

  • Utilice Q objetos y separe cada objeto con un operador lógico. Para obtener más información, consulte Búsquedas complejas con objetos Q en la documentación de Django.

Puede usar objetos Q para ejecutar consultas con varios conjuntos de criterios coincidentes. Para crear un objeto Q, pase el filtro de consulta al método Q(). Puede pasar varios objetos Q como argumentos a su método de consulta y separar cada objeto Q mediante un operador OR (|), AND (&) o XOR (^). También puede negar objetos Q anteponiéndoles el símbolo ~.

Este ejemplo utiliza Q objetos para consultar documentos que cumplan las siguientes condiciones de consulta:

  • title El valor del campo comienza con el texto "Funny" o "Laugh"

  • genres El campo de matriz no contiene el valor "Comedy"

Movie.objects.filter(
(Q(title__startswith="Funny") | Q(title__startswith="Laugh"))
& ~Q(genres__contains=["Comedy"])
)
<QuerySet [<Movie: Laugh, Clown, Laugh>, <Movie: Funny Games>]>

Tip

El ejemplo anterior utiliza una búsqueda de campo en un ArrayField valor. Para obtener más información sobre cómo consultar un valor, consulte ArrayField la sección "Consultar valores de matriz" de esta guía.

En esta sección se describe cómo modificar los resultados de su consulta de las siguientes maneras:

Puede proporcionar un orden de clasificación para los resultados de su consulta mediante el método order_by(). Para especificar un orden ascendente basado en los valores de un campo determinado, pase el nombre del campo como argumento. Para especificar un orden descendente, pase el nombre del campo precedido por el símbolo menos (-) como argumento.

Puedes pasar varios nombres de campos, separados por comas, al método order_by(). El backend de Django MongoDB ordena los resultados por cada campo en el orden suministrado.

Este ejemplo realiza las siguientes acciones:

  • Llama al método filter() en el administrador del modelo Movie para consultar la colección sample_mflix.movies

  • Consulta documentos que tienen un valor title que comienza con el texto "Rocky"

  • Ordena los resultados en orden ascendente de sus valores de campo released

Movie.objects.filter(title__startswith="Rocky").order_by("released")
<QuerySet [<Movie: Rocky>, <Movie: Rocky II>, <Movie: Rocky III>,
<Movie: Rocky IV>, <Movie: Rocky V>, <Movie: Rocky Marciano>,
<Movie: Rocky Balboa>]>

Puede especificar la cantidad de resultados que devuelve una consulta utilizando la sintaxis de segmentación de matrices de Python, como se muestra en el siguiente código:

Model.objects.filter(<query filter>)[<start>:<end>]

Reemplace los marcadores <start> y <end> con valores enteros que representan el subconjunto de resultados que desea devolver. El valor inicial es exclusivo y el valor final es inclusivo.

Si omite el valor <start>, la consulta devuelve cada resultado, comenzando con la primera coincidencia, hasta que devuelve el número especificado por el valor <end>.

Si omite el valor <end>, la consulta devuelve cada resultado pero omite la cantidad de resultados iniciales especificados por <start>.

Este ejemplo realiza las siguientes acciones:

  • Llama al método filter() en el administrador del modelo Movie para consultar la colección sample_mflix.movies

  • Consulta documentos que tienen un valor released de datetime(2010, 7, 16) (julio 16, 2010)

  • Devuelve el tercer y cuarto resultado.

Movie.objects.filter(released=timezone.make_aware(datetime(2010, 7, 16)))[2:4]
<QuerySet [<Movie: Inception>, <Movie: Winter's Bone>]>

Para recuperar el primer resultado de una consulta que podría coincidir con varios resultados, encadene el método first() al método filter(). Pase un filtro de consulta al método filter() que especifique sus criterios de consulta.

El siguiente ejemplo llama a los métodos filter() y first() para consultar la colección sample_mflix.movies del primer documento en el que el valor genres es ["Crime", "Comedy"]:

Movie.objects.filter(genres=["Crime", "Comedy"]).first()
<Movie: The Crew>

Esta sección describe cómo ejecutar consultas en los siguientes campos:

Puedes ejecutar operaciones sobre tu modelo que query campos de modelos embebidos. Para consultar estos campos, especifica el campo de tu modelo y cada nombre de campo embebido separado por dobles guiones bajos (__) hasta llegar al campo que deseas consultar, como se muestra en el siguiente código:

Model.objects.filter(<model field>__<embedded model field>=<value>)

También puede usar búsquedas de campo para refinar su consulta del modelo incrustado. Agregue el tipo de búsqueda después del campo del modelo incrustado que está consultando, precedido por guiones bajos dobles.

Este ejemplo utiliza una búsqueda para consultar el modelo Award, que está incrustado en el modelo Movie. Este modelo incrustado representa el campo awards de la colección sample_mflix.movies y sus campos anidados wins, nominations y text. El siguiente código busca documentos en los que el valor del campo anidado awards.wins sea mayor que 150:

Movie.objects.filter(awards__wins__gt=150)
<QuerySet [<Movie: The Lord of the Rings: The Return of the King>,
<Movie: No Country for Old Men>, <Movie: Slumdog Millionaire>,
<Movie: Boyhood>, <Movie: The Social Network>, <Movie: Inception>,
<Movie: Gravity>, <Movie: Gravity>, <Movie: The Artist>,
<Movie: 12 Years a Slave>, <Movie: Birdman: Or (The Unexpected Virtue of Ignorance)>]>

Puede consultar datos almacenados en un valor ArrayField utilizando la sintaxis de consulta estándar. El backend de Django MongoDB ofrece tipos de búsqueda de campos adicionales para consultar valores ArrayField, que se describen en la siguiente tabla:

Tipo de búsqueda
Descripción

contains

Matches fields that store the provided value as a subset of their data. This ArrayField lookup overrides the contains lookup described in the Use Text Match Lookups section of this guide.

contained_by

Matches fields that store a subset of the provided values. This lookup type is the inverse of contains.

overlap

Matches field that store any of the provided values.

len

Matches fields that store the number of values provided.

El siguiente ejemplo utiliza la búsqueda overlap para consultar documentos cuyo campo genres contiene algún valor en la matriz ["Adventure", "Family"]:

Movie.objects.filter(genres__overlap=["Adventure", "Family"])
<QuerySet [<Movie: The Poor Little Rich Girl>, <Movie: Robin Hood>,
<Movie: Peter Pan>, <Movie: The Thief of Bagdad>, <Movie: Clash of the Wolves>,
<Movie: Beau Geste>, <Movie: The Black Pirate>, <Movie: The Son of the Sheik>,
<Movie: Steamboat Willie>, <Movie: The Big Trail>, <Movie: The Champ>,
'...(remaining elements truncated)...']>

Tip

Los ejemplos de esta sección utilizan las clases de modelo definidas en la sección Almacenar datos de matriz de modelos integrados de la guía Crear modelos.

Puede ejecutar operaciones en su modelo que consulten los campos de una matriz de modelos incrustados. Estas consultas utilizan la misma sintaxis que se describe en la sección "Consultar valores de modelos incrustados":

Model.objects.filter(<model field>__<embedded model field>=<value>)

También puede usar búsquedas de campo para refinar su consulta de modelo incrustado. Agregue el tipo de búsqueda después del campo de modelo incrustado que está consultando, precedido por guiones bajos dobles. Sin embargo, solo puede usar los siguientes tipos de búsqueda para consultar un campo incrustado:

  • exact

  • iexact

  • in

  • gt

  • gte

  • lt

  • lte

Importante

Si las instancias del modelo integradas en su EmbeddedModelArrayField tienen sus propios campos de matriz integrados, no podrá consultar esos valores de campo anidados.

Puede usar el len tipo de búsqueda para filtrar por el número de instancias de modelo integradas en un EmbeddedModelArrayField valor. Para refinar aún más su consulta, puede combinar la len búsqueda con otras búsquedas de comparación.

Este ejemplo utiliza la búsqueda len para consultar el campo cast, que almacena una matriz de modelos Actor incrustados. El siguiente código busca documentos cuya longitud de la matriz cast sea mayor que 5:

Movie.objects.filter(cast__len__gt=5)

Puede utilizar transformaciones de índice y de segmento para consultar elementos específicos de la matriz EmbeddedModelArrayField.

El siguiente ejemplo especifica un índice de matriz para consultar documentos en los que el primer elemento de la matriz cast tiene un valor last_name de "Winslet":

Movie.objects.filter(cast__0__last_name="Winslet")

De manera similar, el siguiente ejemplo utiliza una transformación de segmento para consultar documentos en los que uno de los primeros tres elementos de la matriz cast tiene un valor last_name de "Winslet":

Movie.objects.filter(cast__0_2__last_name="Winslet")

Para consultar los datos almacenados en un PolymorphicEmbeddedModelField valor, utilice la misma sintaxis descrita en la sección anterior "Consultar valores de modelos incrustados". Puede consultar campos compartidos entre los modelos incrustados o campos exclusivos de un modelo específico.

Importante

Evitar nombres de campo conflictivos

Si consulta un campo compartido por varios modelos integrados, pero con diferentes tipos de datos, podría obtener resultados inexactos. Django no puede determinar correctamente qué tipo de dato asignar al valor de búsqueda. En este caso, Django MongoDB Backend itera a través de los modelos integrados y utiliza el primer campo y tipo de dato correspondiente que encuentra.

De manera similar, si consulta un campo de modelo incrustado anidado que tiene el mismo nombre y tipo de datos en varios modelos, Django MongoDB Backend consulta solo el primer modelo enumerado en su definición PolymorphicEmbeddedModelField.

Tip

Los siguientes ejemplos utilizan las clases de modelo definidas en la sección Almacenar datos de modelos integrados polimórficos de la guía Crear modelos.

Este ejemplo utiliza una búsqueda para consultar el campo awards, que puede almacenar modelos incrustados de tipo Oscar o GoldenGlobe. El código busca documentos con un valor awards.wins de 10, que puede coincidir con documentos representados por cualquier tipo de modelo incrustado:

Movie.objects.filter(awards__wins=10)

También puede consultar campos que no se comparten entre los modelos integrados. El siguiente ejemplo consulta el campo awards.best_picture, exclusivo del modelo integrado Oscar:

Movie.objects.filter(awards__best_picture=True)

Para consultar los datos almacenados en un PolymorphicEmbeddedModelArrayField valor, utilice la misma sintaxis y los mismos operadores descritos en la sección "Consultar valores de matriz de modelos incrustados". Puede consultar campos compartidos entre los modelos incrustados o campos exclusivos de un modelo específico.

Importante

Evitar nombres de campo conflictivos

Si consulta un campo compartido por varios modelos integrados, pero con diferentes tipos de datos, podría obtener resultados inexactos. Django no puede determinar correctamente qué tipo de dato asignar al valor de búsqueda. En este caso, Django MongoDB Backend itera a través de los modelos integrados y utiliza el primer campo y el tipo de dato correspondiente que encuentra.

De manera similar, si consulta un campo de modelo incrustado anidado que tiene el mismo nombre y tipo de datos en varios modelos, Django MongoDB Backend consulta solo el primer modelo enumerado en su definición PolymorphicEmbeddedModelArrayField.

Tip

El siguiente ejemplo utiliza las clases de modelo definidas en la sección Almacenar datos de matriz de modelos integrados polimórficos de la guía Crear modelos.

Este ejemplo utiliza una búsqueda para consultar el campo awards, que almacena una matriz de modelos incrustados de tipo Oscar o GoldenGlobe. El código busca documentos con un valor awards.year menor que 2000, que pueden coincidir con documentos representados por cualquiera de los dos tipos de modelos incrustados.

Movie.objects.filter(awards__year__lt=2000)

Importante

Disponible en v6.0.1

Puede utilizar búsquedas espaciales solo en Django MongoDB Backend v6.0.1 y versiones posteriores.

Tip

Campos de GeoDjango

Antes de ejecutar una consulta geoespacial, debe crear un modelo con campos de GeoDjango. Para saber cómo especificar estos campos, consulte la guía de Modelo de Datos Geoespaciales.

Puedes usar búsquedas espaciales para consultar los campos de GeoDjango, que almacenan datos geoespaciales. El backend de Django MongoDB admite las siguientes búsquedas espaciales:

  • contains: Consultas de valores que contienen la geometría de búsqueda especificada, que debe especificar en un objeto Point

  • disjoint:Consultas de valores que están espacialmente separados de la geometría de búsqueda o que no se intersecan con ella.

  • distance_gt: Query para valores donde la distancia desde la geometría de búsqueda es mayor que el valor de distancia especificado

  • distance_lte: Consultas para valores donde la distancia desde la geometría de búsqueda es menor o igual al valor de distancia especificado.

  • dwithin:Consultas de valores donde la distancia desde la geometría de búsqueda está dentro del valor de distancia especificado

  • intersects:Consultas de valores que intersecan espacialmente la geometría de búsqueda

  • within:Consultas de valores que se encuentran espacialmente dentro de los límites de la geometría de búsqueda

Para obtener más información sobre estas búsquedas, consulte Búsquedas espaciales en la documentación de Django.

Tip

Para ver los modelos de muestra utilizados en este ejemplo, consulte el Ejemplo de modelo en la guía Datos geoespaciales del modelo.

Este ejemplo utiliza la búsqueda espacial within para consultar el modelo Theater, que contiene un modelo Location integrado que almacena datos geoespaciales. El código consulta documentos con valores de campo location.geo dentro de los límites de Manhattan:

from django.contrib.gis.geos import Polygon
manhattan_coords = [
[-73.925492, 40.877410],
[-73.910372, 40.872366],
[-73.935127, 40.834020],
[-73.929049, 40.798569],
[-73.976485, 40.711432],
[-74.015747, 40.701229],
[-74.018859, 40.708367],
[-74.008007, 40.754307],
[-73.925492, 40.877410]
]
# Creates a polygon from the coordinates
search_area = Polygon(manhattan_coords)
Theater.objects.filter(location__geo__within=search_area)
<QuerySet [<Theater: 1908>, <Theater: 835>, <Theater: 1448>,
<Theater: 1028>, <Theater: 609>, <Theater: 1906>, <Theater: 1531>,
<Theater: 482>]>

Puede consultar los datos almacenados en un JSONField valor utilizando la misma sintaxis que se muestra en la sección "Consultar valores del modelo incrustado". Encadene cada campo y su nombre anidado, separados por guiones bajos dobles__ (), hasta llegar al campo que desea consultar.

El siguiente ejemplo consulta el campo imdb con valor JSONFielden busca de valores de su campo anidado votes que excedan 900000:

Movie.objects.filter(imdb__votes__gt=900000)
<QuerySet [<Movie: La nao capitana>, <Movie: The Godfather>,
<Movie: This Is Spinal Tap>, <Movie: Forrest Gump>, <Movie: Pulp Fiction>,
<Movie: The Shawshank Redemption>, <Movie: Se7en>,
<Movie: The Lord of the Rings: The Fellowship of the Ring>,
<Movie: The Matrix>, <Movie: Fight Club>,
<Movie: The Lord of the Rings: The Return of the King>,
<Movie: The Lord of the Rings: The Two Towers>, <Movie: The Shawshank Redemption>,
<Movie: Landet som icke èr>, <Movie: The Dark Knight>,
<Movie: The Danish Girl>, <Movie: The Dark Knight Rises>, <Movie: Inception>,
<Movie: Catching the Sun>, <Movie: Scouts Guide to the Zombie Apocalypse>,
'...(remaining elements truncated)...']>

Puede usar expresiones KT() para anotar y filtrar datos almacenados en un valor JSONField. Las expresiones KT() permiten trabajar con el valor de texto de claves, índices o transformaciones de ruta dentro de un valor JSONField. Pase su expresión KT() al método annotate(), que anota cada objeto en el valor QuerySet con las expresiones KT() proporcionadas.

Tip

Para obtener más información sobre las expresiones KT() y el método annotate(), consulte los siguientes recursos en la documentación de Django:

El siguiente ejemplo usa annotate() y KT() para crear una nueva clave score, que almacena valores de campo anidados imdb.rating. A continuación, el código ordena cada documento de la colección sample_mflix.movies según sus valores score en orden descendente:

from django.db.models.fields.json import KT
Movie.objects.annotate(score=KT("imdb__rating")).all().order_by("-score")
<QuerySet [<Movie: No Tomorrow>, <Movie: The Deposit>, <Movie: Man Down>,
<Movie: Convenience>, <Movie: Scouts Guide to the Zombie Apocalypse>,
<Movie: Another World>, <Movie: The Danish Girl>, <Movie: Ad Inexplorata>,
<Movie: Landet som icke èr>, <Movie: The Ghost and the Whale>,
<Movie: Coming to Terms>, <Movie: La nao capitana>, <Movie: All Eyes and Ears>,
<Movie: Catching the Sun>, <Movie: Manhattan Romance>, <Movie: Anomalisa>,
<Movie: Outliving Emily>, <Movie: Mary Loss of Soul>,
<Movie: The Childhood of a Leader>, <Movie: Krot na more>,
'...(remaining elements truncated)...']>

Puede utilizar el acceso directo de búsqueda pk para consultar valores de clave principal, que MongoDB almacena como valores ObjectId.

El siguiente ejemplo consulta la colección sample_mflix.movies en busca de un documento cuya clave principal es ObjectId("573a1394f29313caabce0d37"):

from bson import ObjectId
Movie.objects.get(pk=ObjectId("573a1394f29313caabce0d37"))
// Your ObjectId values might differ
<Movie: Vertigo>

El modelo Movie, que representa la colección sample_mflix.movies, utiliza el campo id como clave principal. El siguiente ejemplo construye la misma consulta que el código anterior utilizando el campo id:

from bson import ObjectId
Movie.objects.get(id=ObjectId("573a1394f29313caabce0d37"))

Para aprender a ejecutar consultas de base de datos sin procesar mediante la sintaxis de canalización de agregación de MongoDB, consulte la guía Realizar consultas de base de datos sin procesar.

Para aprender a realizar otras QuerySet operaciones, consulte la guía Realizar operaciones CRUD.

Para obtener más información sobre las consultas de Django, consulte Realizar consultas en la documentación de Django.

Volver

Operaciones CRUD