Visão geral
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.
API de Consulta
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.
Dados de amostra
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.
Exemplos de código de execução
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.
Executar uma consulta
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
:
Recuperar todos os documentos
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)...']>
Recuperar documentos correspondentes
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>]>
Retrieve One Document
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
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>
Excluir Documentos Correspondentes
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.
Executar queries de banco de dados brutas
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.
Personalize seu filtro de query
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:
Usar pesquisas de correspondência de texto
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 |
---|---|
| 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 . |
Exemplo
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)...']>
Usar pesquisas de comparação
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 |
---|---|
| 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. |
Exemplo
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)...']>
Combinar pesquisas
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.
Exemplo de objeto Q
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.
Modificar Resultados da Query
Esta seção descreve como modificar os resultados da query das seguintes maneiras:
Classificar resultados
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.
Exemplo
Este exemplo executa as seguintes ações:
Chama o método
filter()
no gerenciador do modeloMovie
para consultar a coleçãosample_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>]>
Ignorar e limitar resultados
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>
.
Exemplo
Este exemplo executa as seguintes ações:
Chama o método
filter()
no gerenciador do modeloMovie
para consultar a coleçãosample_mflix.movies
Consulta documentos com um valor
released
dedatetime(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>]>
Recuperar o primeiro resultado
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>
Queries de campo avançadas
Esta seção descreve como executar queries nos seguintes tipos de campo :
Executar queries de um EmbeddedModelField
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.
Exemplo
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)>]>
Fazer query de um arrayField
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 |
---|---|
| 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. |
Exemplo
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)...']>
Executar query de um JSONField
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 JSONField
para 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)...']>
Anote e filtre dados JSON
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
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)...']>
Executar queries de um campo de chave primária
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"))
Informações adicionais
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.