Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

Especifica un query

En esta guía, puedes aprender a utilizar Django MongoDB Backend para especificar una query 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 de modelo. Para ejecutar una query de base de datos de MongoDB, llama a los métodos QuerySet en el administrador de tu modelo. La clase Manager gestiona las operaciones de la base de datos y permite interactuar con los datos de MongoDB haciendo referencia a modelos de Django. Por defecto, Django agrega un Manager llamado objects a cada clase de modelo.

Cuando asignas un QuerySet a una variable, Django MongoDB Backend no realiza la operación hasta que evalúas la variable. Después de evaluar el QuerySet, Django guarda los resultados de la consulta en la caché QuerySet. Las evaluaciones futuras de QuerySet utilizan los resultados almacenados en caché.

Tip

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

Los ejemplos de esta guía utilizan el modelo Movie, que representa la colección sample_mflix.movies de los conjuntos de datos de muestra de Atlas. El modelo Movie contiene un modelo Award incrustado como el valor de su campo awards. 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 la shell interactiva de Python para ejecutar los ejemplos de código. Para ingresar a la shell, ejecute el siguiente comando desde el directorio raíz de su 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 de Django que use el modelo Movie y el shell interactivo de Python para interactuar con documentos de MongoDB, visita el tutorial de Introducción a Django MongoDB Backend.

Para consultar tus datos de MongoDB, llama a un método QuerySet en el administrador de tu modelo y especifica tus criterios de coincidencia en un filtro de query.

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

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

El siguiente ejemplo llama al método all() para recuperar todos los documentos en 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 tu query no coincide con ningún documento o coincide con múltiples documentos, el método get() genera un error. Para recuperar un documento de una query que podría coincidir con varios, utiliza 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 hacer una query a una colección de documentos que no coincidan con tus criterios de búsqueda, llama al método exclude() en el administrador de tu modelo. Pasa 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) (de enero del 1 de 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 los tipos de búsqueda, consulta Búsquedas de campo en la referencia de la API de Django QuerySet.

Esta sección describe cómo refinar los filtros de query de las siguientes maneras:

La siguiente tabla describe algunos de los tipos de búsqueda que puedes usar para ejecutar queries que incluyan criterios de coincidencia específicos para valores de texto:

Tipo de consulta
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 query 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 consulta
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 lte query para consultar documentos en los cuales el valor de runtime es menor o igual que 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:

  • Pasa varios filtros de query a tu método de query, separados por comas. Para ver un ejemplo, consulta Recuperar objetos en la documentación de Django.

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

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

Puedes usar objetos Q para ejecutar queries con múltiples conjuntos de criterios coincidentes. Para crear un Q objeto, pasa tu filtro de query al método Q(). Puedes pasar múltiples objetos Q como argumentos a tu método de consulta y separar cada objeto Q por un operador O (|), Y (&) o XOR (^). También puedes negar objetos Q anteponiéndoles el símbolo ~.

Este ejemplo utiliza objetos Q para query documentos que cumplen con las siguientes condiciones de query:

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

  • genres el campo de arreglo 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 valor ArrayField. Para más información sobre cómo query un ArrayField, consulta la sección Query arreglo Values de esta guía.

Esta sección describe cómo modificar los resultados de la query de las siguientes maneras:

Se puede proporcionar un orden de clasificación para los resultados de la consulta utilizando 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, pasa el nombre del campo precedido de un 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 query la colección sample_mflix.movies

  • Consultas documentos que tienen un valor de 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 de posición <start> y <end> con valores enteros que representen 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 query la colección sample_mflix.movies

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

  • Devuelve el tercer y cuarto resultados

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 query que podría coincidir con múltiples resultados, encadena el método first() al método filter(). Pase un filtro de query al método filter() que especifique sus criterios de query.

El siguiente ejemplo llama a los métodos filter() y first() para query la colección sample_mflix.movies por el 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 puedes usar búsquedas de campo para refinar tu query de modelos embebidos. Adicione su tipo de búsqueda después del campo del modelo incrustado que está consultando, precedido por double guiones bajos.

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 en la colección sample_mflix.movies y sus campos anidados wins, nominations y text. El siguiente código consulta los documentos en los que el valor del campo anidado awards.wins es 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 consulta
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 en esta sección utilizan las clases de modelo definidas en la sección Almacenar datos de arreglos de modelos embebidos de la guía Crear modelos.

Puede ejecutar operaciones en su modelo que consulten campos de un arreglo de modelos integrados. Estas consultas utilizan la misma sintaxis que se describe en la sección Query de valores de modelos integrados:

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

También puedes usar búsquedas de campo para refinar tu query de modelos embebidos. Agregue su tipo de búsqueda después del campo del modelo incrustado que está consultando, precedido de un double guión bajo. Sin embargo, solo puedes 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 incrustadas en su EmbeddedModelArrayField tienen sus propios campos de arreglo incrustados, no puede query esos valores de campos 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 query el campo cast, que almacena un arreglo de modelos Actor incrustados. El siguiente código consulta por documentos en los que la longitud del arreglo cast es mayor que 5:

Movie.objects.filter(cast__len__gt=5)

Puedes usar las transformaciones de índice y corte para consultar elementos específicos de arreglos de tu EmbeddedModelArrayField.

El siguiente ejemplo especifica un índice de arreglo para consultar documentos en los que el primer elemento del arreglo 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 consultas (query) un campo que se comparte entre varios modelos integrados pero tiene diferentes tipos de datos, podrías ver 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 incrustados y utiliza el primer campo y el tipo de dato correspondiente que encuentra.

De manera similar, si consultas un campo anidado de modelo embebido que tiene el mismo nombre y tipo de datos en varios modelos, Django MongoDB Backend solo consulta el primer modelo listado en tu definición de 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 query el campo awards, que puede almacenar modelos incrustados de tipo Oscar o GoldenGlobe. El código query documentos que tienen un valor de awards.wins de 10, lo que puede coincidir con documentos representados por cualquiera de los dos tipos 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 valor PolymorphicEmbeddedModelArrayField, utiliza la misma sintaxis y los mismos operadores descritos en la sección Query valores de arreglos de modelos integrados. Puedes query campos que se comparten entre los modelos embebidos o campos que son únicos de un modelo específico.

Importante

Evitar nombres de campo conflictivos

Si consultas (query) un campo que se comparte entre varios modelos integrados pero tiene diferentes tipos de datos, podrías ver 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 datos correspondiente que encuentra.

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

Tip

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

Este ejemplo utiliza una búsqueda para consultar el campo awards, que almacena un arreglo de modelos incrustados de tipo Oscar o GoldenGlobe. El código query para documentos que tienen un valor de awards.year menor que 2000, lo que puede coincidir con documentos representados por cualquiera de los tipos de modelo incrustado.

Movie.objects.filter(awards__year__lt=2000)

Importante

Disponible en la versión6.0.1

Puedes utilizar búsquedas espaciales sólo en Django MongoDB Backend v6.0.1 y 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 campos GeoDjango, que almacenan datos geoespaciales. El backend de MongoDB para Django admite las siguientes búsquedas espaciales:

  • contains: Consultas de valores que contengan la geometría de búsqueda especificada, que debes 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: Query 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 aprender más sobre estas búsquedas, consulta Consultas espaciales en la documentación de Django.

Tip

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

Este ejemplo utiliza la búsqueda espacial within para query el modelo Theater, que contiene un modelo Location incrustado que almacena datos geoespaciales. El código query para documentos que tienen location.geo valores de campo 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>]>

Puedes query los datos almacenados en un valor JSONField utilizando la misma sintaxis que se muestra en la sección query valores de modelo incrustado. Encadena cada campo y nombre de campo anidado, separados por doble guion bajo (__), hasta llegar al campo que deseas query.

El siguiente ejemplo consulta el campo imdb valorado en JSONFieldpara los valores de su campo votes anidado que superan 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)...']>

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

Tip

Para aprender más sobre las expresiones KT() y el método annotate(), consulta 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)...']>

Puedes utilizar el atajo de búsqueda pk para query los valores de llave primaria, que MongoDB almacenar como valores ObjectId.

El siguiente ejemplo query la colección sample_mflix.movies en busca de un documento cuya llave primaria 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 llave primaria. 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 en bruto de base de datos utilizando la sintaxis del pipeline de agregación de MongoDB, consulta la guía Realizar consultas de base de datos en bruto.

Para aprender cómo realizar otras operaciones de QuerySet, consulta la guía Realizar operaciones CRUD.

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

Volver

Operaciones CRUD