Docs Menu
Docs Home
/ /
/ / /

Realizar consultas de base de datos sin procesar

En esta guía, aprenderá a usar el backend de Django MongoDB para ejecutar consultas sin procesar en su base de datos MongoDB. Las consultas sin procesar le permiten consultar la base de datos utilizando la sintaxis de canalización de agregación de MongoDB en lugar de los métodos de Django. También puede ejecutar consultas directamente en su... MongoClient objeto para acceso ampliado a sus datos de MongoDB.

La API de Django QuerySet proporciona un método raw(), que permite realizar queries SQL en bases de datos relacionales. Sin embargo, Django MongoDB Backend no soporta el método raw(). En vez de esto, el ODM ofrece el método raw_aggregate(), que se puede utilizar para enviar instrucciones a la base de datos en etapas de un pipeline.

Nota

Django proporciona un método QuerySet.aggregate(), que difiere del método QuerySet.raw_aggregate(). Puedes usar aggregate() para recuperar valores agregando una colección de objetos del modelo. Para obtener más información sobre el método aggregate(), consulta aggregate en la documentación de Django.

Puede ejecutar consultas de base de datos llamando a los métodos QuerySet en la clase Manager de su modelo. La clase Manager gestiona las operaciones de base de datos y le permite interactuar con sus datos de MongoDB haciendo referencia a los modelos de Django. Por defecto, Django añade un Manager llamado objects a cada clase de modelo. Este Manager predeterminado no admite el método raw_aggregate(). Para usar este método específico de MongoDB, configure el campo objects de su modelo con un gestor personalizado llamado MongoManager.

Los ejemplos de esta guía utilizan los Movie Theater modelos y, que representan colecciones en la sample_mflix base de datos de los conjuntos de datos de ejemplo de Atlas. Estos modelos configuran explícitamente el objects campo para usar una clase MongoManager personalizada, en lugar de la Manager clase predeterminada de Django. Esta guía también utiliza un Location modelo incrustado para representar el Theater campo de ubicación del modelo. Las clases del modelo tienen las siguientes definiciones:

from django.db import models
from django.contrib.gis.db import models
from django_mongodb_backend.fields import ArrayField, EmbeddedModelField
from django_mongodb_backend.models import EmbeddedModel
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 Location(EmbeddedModel):
address = models.JSONField(null=True)
geo = models.PointField()
class Theater(models.Model):
theaterId = models.IntegerField(default=0)
location = EmbeddedModelField(Location, null=True, blank=True)
class Meta:
db_table = "theaters"
managed = False
def __str__(self):
return self.theaterId

Los modelos Movie y Theater incluyen 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 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, Theater, Location
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.

Para ejecutar una consulta de base de datos sin procesar, pase una canalización de agregación al método raw_aggregate(). Las canalizaciones de agregación contienen una o más etapas que proporcionan instrucciones sobre cómo procesar los documentos. Tras llamar al método raw_aggregate(), Django MongoDB Backend pasa la canalización al método pymongo.collection.Collection.aggregate() y devuelve los resultados de la consulta como objetos del modelo.

Tip

Para obtener más información sobre la construcción de canales de agregación, consulte Canalización de agregación en el manual de MongoDB Server.

Esta sección muestra cómo utilizar el método raw_aggregate() para realizar las siguientes tareas:

Este ejemplo ejecuta una consulta de base de datos sin procesar llamando al método raw_aggregate() en el MongoManager del modelo Movie, que consulta la colección sample_mflix.movies. El código pasa las siguientes etapas de la canalización de agregación a raw_aggregate():

  • $match: Filtra los documentos que tienen un valor de campo title de "The Parent Trap"

  • $project: Incluye los campos title y released de los objetos del modelo devueltos

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.

Nota

El método raw_aggregate() devuelve instancias de modelo diferidas, lo que significa que puede cargar campos omitidos por la etapa $project bajo demanda. En el ejemplo anterior, la consulta recupera los campos title y released. La sentencia print ejecuta una consulta independiente para recuperar el campo plot.

Tip

También puedes ejecutar consultas de búsqueda de MongoDB mediante las expresiones de búsqueda de Django MongoDB Backend. Para obtener más información, consulta la guía "Ejecutar una consulta de búsqueda de MongoDB".

Puede ejecutar consultas de búsqueda de MongoDB en su base de datos para realizar búsquedas de texto detalladas. Estas consultas ofrecen funciones de búsqueda avanzadas, como la coincidencia de frases de texto, la puntuación de los resultados por relevancia y el resaltado de coincidencias.

Para especificar una consulta de búsqueda de MongoDB, cree un índice de búsqueda que cubra los campos que desea consultar. A continuación, pase una etapa $search o $searchMeta en un parámetro de canalización de agregación al método raw_aggregate().

Tip

Para aprender a crear índices de búsqueda, consulte Índices de búsqueda en la guía Crear índices.

Este ejemplo ejecuta una consulta de búsqueda de MongoDB pasando la etapa de canalización $search al método raw_aggregate(). El código realiza las siguientes acciones:

  • Especifica el índice de búsqueda que cubre el campo plot

  • Consultas de documentos cuyos valores plot contienen la cadena "whirlwind romance" con no más de 3 palabras entre ellos

  • Devuelve partes de los valores de la cadena plot que coinciden con la consulta y los metadatos que indican dónde ocurrieron las coincidencias

  • Incluye el campo title y el highlight, o texto coincidente, 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

Al ejecutar el ejemplo anterior, asegúrese de reemplazar el marcador de posición <search-index-name> con el nombre de su índice de búsqueda que cubre el campo plot.

Tip

Búsquedas espaciales

A partir de la versión 6800 del backend de Django MongoDB,6.0.1 puede usar algunas búsquedas espaciales de la API GIS QuerySet. Para obtener más información, consulte Consultar valores geoespaciales en la guía Especificar una consulta.

Puede usar el método raw_aggregate() para ejecutar consultas en campos que contienen datos geoespaciales. Los datos geoespaciales representan una ubicación geográfica en la superficie de la Tierra o en un plano euclidiano.

Para ejecutar una consulta geoespacial, cree un índice 2d o 2dsphere en los campos que contienen datos geoespaciales. A continuación, pase uno de los siguientes operadores de consulta en un parámetro de canalización de agregación al método raw_aggregate():

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects

Tip

El backend de Django MongoDB crea automáticamente 2dsphere índices en GeoDjango campos, incluyendo los PointField definidos en Location el modelo de ejemplo de esta guía. Para aprender a definir estos campos, consulte la guía Modelar datos geoespaciales.

Este ejemplo ejecuta una consulta geoespacial pasando las etapas de canalización $match y $geoWithin al método raw_aggregate(). El código realiza las siguientes acciones:

  • Especifica una lista de coordenadas que representan los límites de Chicago

  • Consultas de documentos en los que el campo location.geo almacena una ubicación dentro del área de Chicago

  • Recupera e imprime los valores theaterId de cada sala de cine en Chicago

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

Si desea ejecutar operaciones de base de datos que ni la API QuerySet ni el método raw_aggregate() ofrecen, puede operar directamente en su MongoClient. Al trabajar con el MongoClient, puede acceder a las operaciones de base de datos del controlador de PyMongo. Use la siguiente sintaxis para exponer el MongoClient:

from django.db import connections
client = connections["<DATABASES key>"].database.client

Reemplace el marcador "<DATABASES key>" con la clave de su diccionario DATABASES correspondiente a su base de datos de destino. Para usar su base de datos predeterminada, reemplace el marcador con "default".

Tip

Para aprender a usar PyMongo para interactuar con datos de MongoDB, consulte la documentación de PyMongo.

Para ver más ejemplos que utilizan el raw_aggregate() método, consulte Referencia de API de QuerySet en la documentación de API de backend de Django MongoDB.

Para obtener más información sobre cómo ejecutar operaciones de agregación, consulte Operaciones de agregación en el manual de MongoDB Server.

Para obtener más información sobre MongoDB Search, consulte MongoDB Search en la documentación de Atlas.

Para obtener más información sobre cómo ejecutar consultas geoespaciales, consulte Consultas geoespaciales en el manual de MongoDB Server.

Volver

Especifica un query

En esta página