Overview
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.
API de consulta
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.
Datos de muestra
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.
Ejecutar ejemplos de código
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.
Ejecutar una consulta
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:
Recuperar todos los documentos
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)...']>
Recuperar documentos coincidentes
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>]>
Retrieve One Document
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
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>
Excluir documentos coincidentes
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.
Ejecutar queries sin formato a la base de datos
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.
Personaliza tu filtro de consulta
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:
Utilice búsquedas de coincidencia de texto
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 |
|---|---|
| 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. |
| Specifies a partial text match. You can specify a case-insensitive partial text match
by using icontains. |
| Matches field values that begin with the specified text. You can specify a case-insensitive partial text match
by using istartswith. |
| Matches field values that end with the specified text. You can specify a case-insensitive partial text match
by using iendswith. |
Ejemplo
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)...']>
Utiliza las búsquedas por comparación
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 |
|---|---|
| Matches field values that are greater than the
specified value. |
| Matches field values that are greater than or equal
to the specified value. |
| Matches field values that are less than the specified
value. |
| Matches field values that are less or equal to than the specified
value. |
Ejemplo
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)...']>
Combinar búsquedas
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
Qobjetos 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.
Ejemplo de objeto Q
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:
titleEl valor del campo comienza con el texto"Funny"o"Laugh"genresEl 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.
Modificar resultados de la consulta
En esta sección se describe cómo modificar los resultados de su consulta de las siguientes maneras:
Ordenar resultados
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.
Ejemplo
Este ejemplo realiza las siguientes acciones:
Llama al método
filter()en el administrador del modeloMoviepara consultar la colecciónsample_mflix.moviesConsulta documentos que tienen un valor
titleque 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>]>
Omitir y limitar resultados
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>.
Ejemplo
Este ejemplo realiza las siguientes acciones:
Llama al método
filter()en el administrador del modeloMoviepara consultar la colecciónsample_mflix.moviesConsulta documentos que tienen un valor
releaseddedatetime(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>]>
Recuperar el primer resultado
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>
Consultas de campo avanzadas
Esta sección describe cómo ejecutar consultas en los siguientes campos:
Consultar valores del modelo integrado
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.
Ejemplo
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)>]>
Valores de la matriz de consulta
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 |
|---|---|
| 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. |
| Matches fields that store a subset of the provided values.
This lookup type is the inverse of contains. |
| Matches field that store any of the provided values. |
| Matches fields that store the number of values provided. |
Ejemplo
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)...']>
Consulta de valores de matriz de modelos incrustados
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:
exactiexactingtgteltlte
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.
Ejemplo de transformación de longitud
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)
Ejemplo de transformaciones de índice y corte
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")
Consulta de valores de modelos incrustados polimórficos
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.
Ejemplos
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)
Consulta de valores de matriz de modelos incrustados polimórficos
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.
Ejemplo
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)
query valores geoespaciales
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 objetoPointdisjoint: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 especificadodistance_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 especificadointersects:Consultas de valores que intersecan espacialmente la geometría de búsquedawithin: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.
Ejemplo
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>]>
Query JSON Values
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)...']>
Anotar y filtrar datos JSON
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
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)...']>
Consulta los valores de la clave primaria
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"))
Información Adicional
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.