Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Backend do Django MongoDB
/

Especificar uma query

Neste guia, você pode aprender como usar o Django MongoDB Backend para especificar uma query de banco de dados .

Você pode refinar o conjunto de documentos que uma query retorna criando um filtro de query. Um filtro de query é uma expressão que especifica os critérios de pesquisa que o MongoDB usa para corresponder a documentos em uma operação de leitura ou gravação. Em um filtro de query, você pode solicitar ao Django MongoDB Backend para procurar documentos com uma correspondência exata à sua query, ou você pode compor filtros de query para expressar critérios de correspondência mais complexos.

A API Django QuerySet fornece métodos que permitem recuperar objetos de modelo. Para executar uma query de banco de dados MongoDB , chame os métodos QuerySet no gerenciador do seu modelo. A classe Manager lida com operações de banco de dados e permite que você interaja com os dados do MongoDB fazendo referência a modelos do Django. Por padrão, o Django adiciona um Manager denominado objects a cada classe de modelo.

Quando você atribui um QuerySet a uma variável, o Django MongoDB Backend não executa a operação até que você avalie a variável. Depois de avaliar QuerySet, o Django salva os resultados da query no cache QuerySet. Futuras avaliações do QuerySet usam os resultados em cache.

Dica

Para saber mais sobre a API do Django QuerySet, consulte QuerySet na documentação do Django.

Os exemplos neste guia usam o Movie modelo, que representa a sample_mflix.movies collection dos conjuntos de dados de amostra do Atlas . O modelo Movie contém um modelo Award incorporado como valor de seu campo awards. Essas classes de modelo têm as seguintes definições:

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

O modelo Movie inclui uma classe Meta interna, que especifica os metadados do modelo, e um método __str__(), que define a representação de string do modelo. Para saber mais sobre essas funcionalidades de modelo, consulte Definir um modelo no guia Criar modelos.

Você pode usar o shell interativo do Python para executar os exemplos de código. Para entrar na shell, execute o seguinte comando no diretório raiz do seu projeto:

python manage.py shell

Depois de inserir o shell do Python, certifique-se de importar os seguintes modelos e módulos:

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

Para saber como criar um aplicação Django que use o modelo Movie e o shell interativo Python para interagir com documentos do MongoDB, acesse o tutorial de Introdução.

Para executar uma query de seus dados do MongoDB , chame um método QuerySet no gerenciador do seu modelo e especifique seus critérios correspondentes em um filtro de query.

Esta seção descreve como usar os seguintes métodos da API QuerySet:

Para recuperar todos os documentos de uma collection, chame o método all() no gerenciador do seu modelo.

O exemplo a seguir chama o método all() para recuperar todos os documentos na coleção 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 fazer query de uma coleção para documentos que correspondam a um conjunto de critérios, chame o método filter() no gerenciador do seu modelo. Passe um filtro de query para o método filter() que especifica seus critérios de query.

O exemplo a seguir chama o método filter() para fazer query da collection sample_mflix.movies para documentos que tenham um 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 um documento de uma coleção, chame o método get() no gerenciador do seu modelo. Passe um filtro de query para o método get() que especifica seus critérios de query.

Importante

Se a sua query não corresponder a nenhum documento ou a vários documentos, o método get() gerará um erro. Para recuperar um documento de uma query que possa corresponder a vários, use o método first().

O exemplo a seguir chama o método get() para recuperar um documento que tem um valor title de "Finding Nemo":

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

Para fazer query de uma coleção de documentos que não atendem aos seus critérios de pesquisa, chame o método exclude() no gerenciador do seu modelo. Passe os critérios de exclusão como um argumento para o método exclude().

O exemplo a seguir chama o método exclude() para excluir documentos lançados antes de datetime(1980, 1, 1) (janeiro de 1, 1980) dos resultados:

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)...']>

Dica

O exemplo anterior utiliza a pesquisa do campo lt para consultar a coleção. Para saber mais sobre pesquisas de comparação, consulte a seção Usar pesquisas de comparação neste guia.

Se quiser executar queries complexas que a API de query do Django não suporta, você pode usar o método raw_aggregate(). Esse método permite que você especifique seus critérios de query em um agregação pipeline do MongoDB , que você passa como argumento para raw_aggregate().

Para saber como executar queries de banco de dados bruto, consulte o guia Executar queries de banco de dados bruto.

Você pode refinar ainda mais seus critérios de query usando uma pesquisa de campo em seu filtro de query. As pesquisas de campo permitem esclarecer a relacionamento entre o campo que você está consultando e o valor para o qual deseja consultar. Use a seguinte sintaxe para especificar uma pesquisa de campo :

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

Você pode usar diferentes tipos de pesquisa para executar queries avançadas, como correspondência parcial de texto, queries de elementos de array, correspondência de expressão regulares e correspondência de valores de ano para campos de data e hora.

Dica

Para visualizar uma lista completa de tipos de pesquisa, consulte Pesquisas de campo na QuerySet referência da API do Django do.

Esta seção descreve como refinar seus filtros de query das seguintes maneiras:

A tabela a seguir descreve alguns dos tipos de pesquisa que você pode usar para executar queries que incluem critérios correspondentes específicos para valores de texto:

Tipo de pesquisa
Descrição

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.

O exemplo a seguir usa a pesquisa contains para fazer query de documentos nos quais o valor plot inclui o 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)...']>

A tabela a seguir descreve alguns dos tipos de pesquisa que você pode usar para executar queries que avaliam um valor de campo em relação a um valor especificado:

Tipo de pesquisa
Descrição

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.

O exemplo a seguir usa a pesquisa lte para fazer query de documentos nos quais o valor runtime é menor ou 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)...']>

Você pode executar queries que usam vários conjuntos de critérios correspondentes das seguintes maneiras:

  • Passe vários filtros de query para o seu método de query, separados por vírgulas. Para ver um exemplo, consulte Recuperando objetos na documentação do Django.

  • Encadeie métodos de query juntos. Para saber mais,consulte Encadeamento de filtros na documentação do Django.

  • Use Q objetos e separe cada objeto com um operador lógico. Para saber mais, consulte Pesquisas complexas com objetos Q na documentação do Django.

Você pode usar objetos Q para executar queries com vários conjuntos de critérios correspondentes. Para criar um objeto Q, passe o filtro de query para o método Q(). Você pode passar vários objetos Q como argumentos para seu método de query e separar cada objeto Q por um operador OR (|), AND (&) ou XOR (^). Você também pode negar objetos Q prefixando-os com o símbolo ~.

Este exemplo utiliza objetos Q para fazer query de documentos que atendam às seguintes condições de query:

  • title o valor do campo começa com o texto "Funny" ou "Laugh"

  • genres o campo da array não contém o 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>]>

Dica

O exemplo anterior utiliza uma pesquisa de campo em um valor ArrayField. Para obter mais informações sobre como consultar um, consulte ArrayField a seção Consultar um ArrayField neste guia.

Esta seção descreve como modificar os resultados da query das seguintes maneiras:

Você pode fornecer uma ordem de classificação para os resultados da query usando o método order_by(). Para especificar uma classificação ascendente com base nos valores de um determinado campo, passe o nome do campo como argumento. Para especificar uma classificação decrescente, passe o nome do campo prefixado com um símbolo de menos (-) como argumento.

Você pode passar vários nomes de campo , separados por vírgulas, para o método order_by(). O Django MongoDB Backend classifica os resultados de cada campo na ordem fornecida.

Este exemplo executa as seguintes ações:

  • Chama o método filter() no gerenciador do modelo Movie para consultar a coleção sample_mflix.movies

  • Faz a query de documentos que têm um valor de title começando com o texto "Rocky"

  • Classifica os resultados em ordem crescente de seus 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>]>

Você pode especificar o número de resultados que uma query retorna usando a sintaxe de fatia de matriz do Python, conforme mostrado no código a seguir:

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

Substitua os placeholders <start> e <end> por valores inteiros que representam o subconjunto de resultados que você deseja retornar. O valor inicial é exclusivo e o valor final é inclusivo.

Se você omitir o valor <start>, a query retornará cada resultado, começando com a primeira correspondência, até retornar o número especificado pelo valor <end>.

Se você omitir o valor do <end>, a query retornará cada resultado, mas ignorará o número de resultados iniciais especificado por <start>.

Este exemplo executa as seguintes ações:

  • Chama o método filter() no gerenciador do modelo Movie para consultar a coleção sample_mflix.movies

  • Consulta documentos com um valor released de datetime(2010, 7, 16) (16 de julho 2010)

  • Retorna o terceiro e o quarto resultados

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

Para recuperar o primeiro resultado de uma query que pode corresponder a vários resultados, encadeie o método first() ao método filter(). Passe um filtro de query para o método filter() que especifica seus critérios de query.

O exemplo a seguir chama os métodos filter() e first() para consultar a coleção sample_mflix.movies para o primeiro documento no qual o valor genres é ["Crime", "Comedy"]:

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

Esta seção descreve como executar queries nos seguintes tipos de campo :

Você pode executar operações em seu modelo que consultam campos de modelos incorporados. Para executar query desses campos, especifique o campo do modelo e cada nome de campo incorporado separados por sublinhados duplos (__) até chegar ao campo que deseja executar a query, conforme mostrado no código a seguir:

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

Você também pode usar pesquisas de campo para refinar sua query de modelo embarcado. Adicione seu tipo de pesquisa após o campo do modelo incorporado que você está consultando, prefixado por sublinhados duplos.

Este exemplo utiliza um lookup para consultar o modelo Award, que está embutido no modelo Movie. Este modelo incorporado representa o campo awards na coleção sample_mflix.movies e seus campos wins, nominations e text aninhados. As seguintes queries de código para documentos em que o valor de campo aninhado awards.wins é maior 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)>]>

Você pode fazer query dos dados armazenados em um valor ArrayField usando a sintaxe de query padrão. O Django MongoDB Backend fornece tipos adicionais de pesquisa de campo para a consulta de valores ArrayField, que são descritos na tabela a seguir:

Tipo de pesquisa
Descrição

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.

O exemplo seguinte utiliza a pesquisa overlap para fazer query de documentos cujo campo genres contém quaisquer valores na array ["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)...']>

Você pode executar uma query dos dados armazenados em um JSONField valor de usando a mesma sintaxe mostrada na seção Consultar um campo EmbeddedModelField. Encadeie cada campo e nome de campo aninhado juntos, separados por sublinhados duplos (__), até chegar ao campo que deseja fazer query.

O exemplo a seguir consulta o campo imdb com valor JSONFieldpara valores de seu campo votes aninhado que excedem 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)...']>

Você pode utilizar expressões do KT() para anotar e filtrar dados armazenados em um valor do JSONField. As expressões KT() permitem trabalhar com o valor de texto de chaves, índices ou transformações de caminho em um JSONField. Passe sua expressão KT() para o método annotate(), que anota cada objeto no QuerySet com as expressões KT() fornecidas.

Dica

Para saber mais sobre expressões KT() e o método annotate(), consulte os seguintes recursos na documentação do Django:

O exemplo seguinte utiliza annotate() e KT() para criar uma nova chave score, que armazena valores de campo aninhados imdb.rating. Em seguida, o código classifica cada documento na coleção sample_mflix.movies por seus valores score descendentes:

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)...']>

Você pode usar o atalho de pesquisa pk para consultar valores de chave primária , que o MongoDB armazena como valores ObjectId.

O exemplo a seguir consulta a coleção sample_mflix.movies para um documento cuja chave primária é ObjectId("573a1394f29313caabce0d37"):

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

O modelo Movie, que representa a collection sample_mflix.movies, usa o campo id como sua chave primária. O exemplo seguinte constrói a mesma query do código anterior utilizando o campo id :

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

Para saber como executar queries de banco de dados bruto usando a sintaxe de pipeline de agregação do MongoDB, consulte o guia Executar queries de banco de dados brutos.

Para saber como realizar outras QuerySet operações, consulte o guia Executar operações CRUD.

Para saber mais sobre queries do Django,consulte Criando queries na documentação do Django.

Voltar

Operações CRUD