Visão geral
Neste guia, você pode aprender como usar o Django MongoDB Backend para executar queries brutas em seu banco de dados MongoDB . As queries brutas permitem consultar o banco de dados usando a sintaxe de pipeline de agregação do MongoDB em vez dos métodos do Django. Você também pode executar queries diretamente no seu objeto MongoClient
para expandir o acesso aos dados do MongoDB .
API de Consulta
A API do Django QuerySet
fornece um método raw()
, que permite executar queries SQL bruto em bancos de dados relacionais. No entanto, o Backend Django MongoDB não suporta o método raw()
. Em vez disso, o ODM fornece o método raw_aggregate()
, que você pode usar para enviar instruções ao banco de dados em estágios de pipeline.
Observação
O Django fornece um método QuerySet.aggregate()
, que difere do método QuerySet.raw_aggregate()
. Você pode usar aggregate()
para recuperar valores agregando uma coleção de objetos de modelo. Para saber mais sobre o método aggregate()
, consulte aggregate
na documentação do Django.
Você pode executar queries de banco de dados chamando métodos QuerySet
no Manager
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. Este Manager
padrão não suporta o método raw_aggregate()
. Para usar esse método específico do MongoDB, defina o campo objects
do seu modelo como um gerenciador personalizado chamado MongoManager
.
Dados de amostra
Os exemplos neste guia usam os Movie
Theater
modelos e, que representam coleções no sample_mflix
banco de dados a partir dos conjuntos de dados de amostra do Atlas . Esses modelos definem explicitamente o campo objects
como MongoManager
personalizado, em vez da classe Manager
padrão do Django. As classes de modelo têm as seguintes definições:
from django.db import models from django_mongodb_backend.fields import ArrayField from django_mongodb_backend.managers import MongoManager 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) genres = ArrayField(models.CharField(max_length=100), null=True, blank=True) objects = MongoManager() class Meta: db_table = "movies" managed = False def __str__(self): return self.title class Theater(models.Model): theaterId = models.IntegerField(default=0) objects = MongoManager() class Meta: db_table = "theaters" managed = False def __str__(self): return self.theaterId
Os modelos Movie
e Theater
incluem 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, Theater 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 queries brutas
Para executar uma query de banco de dados bruto, passe um pipeline de agregação para o método raw_aggregate()
. Os pipelines de agregação contêm um ou mais estágios que fornecem instruções sobre como processar documentos. Depois de chamar o método raw_aggregate()
, o Django MongoDB Backend passa seu pipeline para o método pymongo.collection.Collection.aggregate()
e retorna os resultados da query como objetos de modelo.
Dica
Para saber mais sobre a construção de agregação pipelines, consulte Aggregation Pipeline no manual do MongoDB Server .
Esta seção mostra como usar o método raw_aggregate()
para executar as seguintes tarefas:
Filtrar e projetar campos de documento
Este exemplo executa uma query do banco de dados bruto chamando o método raw_aggregate()
no MongoManager
do seu modelo Movie
, que query a collection sample_mflix.movies
. O código passa os seguintes estágios do pipeline de agregação para raw_aggregate()
:
$match
: filtros para documentos que têm um valor de campotitle
de"The Parent Trap"
$project
: inclui os campostitle
ereleased
dos objetos de modelo retornados
movies = Movie.objects.raw_aggregate([ {"$match": {"title": "The Parent Trap"}}, {"$project": { "title": 1, "released": 1 } }]) for m in movies: print(f"Plot of {m.title}, released on {m.released}: {m.plot}\n")
Plot of The Parent Trap, released on 1961-06-21 00:00:00+00:00: Teenage twin girls swap places and scheme to reunite their divorced parents. Plot of The Parent Trap, released on 1998-07-29 00:00:00+00:00: Identical twins, separated at birth and each raised by one of their biological parents, discover each other for the first time at summer camp and make a plan to bring their wayward parents back together.
Observação
O método raw_aggregate()
retorna instâncias de modelo adiadas, o que significa que você pode carregar campos omitidos pelo estágio $project
sob demanda. No exemplo anterior, a query recupera os campos title
e released
. A instrução print executa uma query separada para recuperar o campo plot
.
executar uma query de pesquisa Atlas
Você pode executar queries do Atlas Search em seu banco de dados para realizar pesquisas de texto refinadas. Essas queries oferecem funcionalidade de pesquisa avançada, como correspondência de frases de texto, pontuação de resultados por relevância e realce de correspondências.
Para especificar uma query do Atlas Search , crie um índice do Atlas Search que abranja os campos que você deseja executar a query. Em seguida, passe um estágio $search
ou $searchMeta
em um parâmetro do pipeline de agregação para o método raw_aggregate()
.
Importante
Você não pode utilizar a API QuerySet
para criar índices de Atlas Search . No entanto, você pode criar um índice expondo seu objeto MongoClient
diretamente, no qual você pode chamar o método create_search_index()
do driver PyMongo. Para saber como expor MongoClient
o, consulte a seção Operações MongoClient deste guia.
Para obter instruções sobre como usar o driver do PyMongo para criar um índice do Atlas Search , consulte Índices do Atlas Search e Vector Search na documentação do PyMongo.
Este exemplo executa uma query do Atlas Search passando o estágio de pipeline $search
para o método raw_aggregate()
. O código executa as seguintes ações:
Especifica o índice do Atlas Search que cobre o campo
plot
Queries de documentos cujos valores
plot
contêm a string"whirlwind romance"
com não mais de3
palavras entre elesRetorna partes dos valores da string
plot
que correspondem à query e aos metadados que indicam onde as correspondências ocorreramInclui o campo
title
e ohighlight
, ou texto correspondente, de cada resultado
movies = Movie.objects.raw_aggregate([ { "$search": { "index": "<search-index-name>", "phrase": { "path": "plot", "query": "whirlwind romance", "slop": 3 }, "highlight": { "path": "plot" } } }, { "$project": { "title": 1, "highlight": {"$meta": "searchHighlights"} } } ]) for m in movies: print(f"Title: {m.title}, text match details: {m.highlight}\n")
Title: Tokyo Fiancèe, text match details: [{'score': 2.3079638481140137, 'path': 'plot', 'texts': [{'value': 'A young Japanophile Belgian woman in Tokyo falls into a ', 'type': 'text'}, {'value': 'whirlwind', 'type': 'hit'}, {'value': ' ', 'type': 'text'}, {'value': 'romance', 'type': 'hit'}, {'value': ' with a Francophile Japanese student.', 'type': 'text'}]}] Title: Designing Woman, text match details: [{'score': 2.3041324615478516, 'path': 'plot', 'texts': [{'value': 'A sportswriter and a fashion-designer marry after a ', 'type': 'text'}, {'value': 'whirlwind', 'type': 'hit'}, {'value': ' ', 'type': 'text'}, {'value': 'romance', 'type': 'hit'}, {'value': ', and discover they have little in common.', 'type': 'text'}]}] Title: Vivacious Lady, text match details: [{'score': 2.220963478088379, 'path': 'plot', 'texts': [{'value': 'On a quick trip to the city, young university professor Peter Morgan falls in love with nightclub performer Francey Brent and marries her after a ', 'type': 'text'}, {'value': 'whirlwind', 'type': 'hit'}, {'value': ' ', 'type': 'text'}, {'value': 'romance', 'type': 'hit'}, {'value': '. ', 'type': 'text'}]}] Title: Ek Hasina Thi, text match details: [{'score': 3.11773419380188, 'path': 'plot', 'texts': [{'value': 'The ', 'type': 'text'}, {'value': 'whirlwind', 'type': 'hit'}, {'value': ' ', 'type': 'text'}, {'value': 'romance', 'type': 'hit'}, {'value': ' turns sour when she is framed for his underworld crimes. ', 'type': 'text'}]}] Title: Kick, text match details: [{'score': 2.00649356842041, 'path': 'plot', 'texts': [{'value': 'An adrenaline junkie walks away from a ', 'type': 'text'}, {'value': 'whirlwind', 'type': 'hit'}, {'value': ' ', 'type': 'text'}, {'value': 'romance', 'type': 'hit'}, {'value': ' and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.', 'type': 'text'}]}] Title: A Tale of Winter, text match details: [{'score': 3.3978850841522217, 'path': 'plot', 'texts': [{'value': 'Felicie and Charles have a serious if ', 'type': 'text'}, {'value': 'whirlwind', 'type': 'hit'}, {'value': ' holiday ', 'type': 'text'}, {'value': 'romance', 'type': 'hit'}, {'value': '. ', 'type': 'text'}]}]
Importante
Ao executar o exemplo anterior, certifique-se de substituir o espaço reservado <search-index-name>
pelo nome do índice do Atlas Search que cobre o campo plot
.
Executar query de dados geoespaciais
Você pode utilizar o método raw_aggregate()
para executar queries em campos contendo dados geoespaciais. Os dados geoespaciais representam uma localização geográfica na superfície da Terra ou em um plano euclidiano.
Para executar uma query geoespacial, crie um índice 2d
ou 2dsphere
em campos contendo dados geoespaciais. Em seguida, passe um dos seguintes operadores de query em um parâmetro do pipeline de agregação para o método raw_aggregate()
:
$near
$geoWithin
$nearSphere
$geoIntersects
Importante
Você não pode utilizar a API QuerySet
para criar índices 2d
ou 2dsphere
. No entanto, você pode criar índices expondo diretamente seu objeto MongoClient
, no qual você pode chamar o método create_index()
do driver PyMongo. Para saber como expor MongoClient
o, consulte a seção Operações do MongoClient deste guia.
Para obter instruções sobre como usar o driver PyMongo para criar índices geoespaciais, consulte Índices geoespaciais na documentação do PyMongo.
Este exemplo executa uma query geoespacial passando os estágios de pipeline $match
e $geoWithin
para o método raw_aggregate()
. O código executa as seguintes ações:
Especifica uma lista de coordenadas que representam os limites de Chigogo
Queries de documentos em que o campo
location.geo
armazena um local dentro da área de ChigogoRecupera e imprime os valores
theaterId
de cada cinema em Chigago
chicago_bounds = { "type": "Polygon", "coordinates": [[ [-87.851, 41.976], [-87.851, 41.653], [-87.651, 41.653], [-87.651, 41.976], [-87.851, 41.976] ]] } theaters = Theater.objects.raw_aggregate([ { "$match": { "location.geo": { "$geoWithin": { "$geometry": chicago_bounds } } } }, { "$project": { "theaterId": 1 } } ]) for t in theaters: print(f"Theater ID: {t.theaterId}")
Theater ID: 2447 Theater ID: 311 Theater ID: 320 Theater ID: 2960 Theater ID: 2741 Theater ID: 306 Theater ID: 322 Theater ID: 319 Theater ID: 2862 Theater ID: 1777 Theater ID: 814 Theater ID: 323
Operações do MongoClient
Se desejar executar operações de banco de dados que nem a API QuerySet
nem o método raw_aggregate()
fornecem, você poderá operar diretamente em seu MongoClient
. Ao trabalhar com o MongoClient
, você pode acessar as operações do banco de dados do driver PyMongo. Use a seguinte sintaxe para expor o MongoClient
:
from django.db import connections client = connections["<DATABASES key>"].database.client
Substitua o espaço reservado "<DATABASES key>"
pela chave em seu dicionário DATABASES
que corresponde ao seu banco de dados de destino. Para utilizar seu banco de dados padrão, substitua o espaço reservado por "default"
.
Dica
Para saber como usar o PyMongo para interagir com dados do MongoDB , consulte a documentação do PyMongo.
Informações adicionais
Para ver mais exemplos que usam o raw_aggregate()
método, consulte Referência da API QuerySet na documentação da API de backend do Django MongoDB .
Para saber mais sobre como executar operações de agregação , consulte Operações de agregação no manual do MongoDB Server .
Para saber mais sobre o Atlas Search, consulte Atlas Search na documentação do Atlas .
Para saber mais sobre como executar queries geoespaciais, consulte queries geoespaciais no manual do MongoDB Server .