Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
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 se diferencia del método QuerySet.raw_aggregate(). Puede usar aggregate() para recuperar valores agregando una colección de objetos de modelo. Para obtener más información sobre el método aggregate(), consulte aggregate en la documentación de Django.

Puedes ejecutar consultas a la base de datos llamando a los métodos QuerySet en el Manager de tu modelo. La clase Manager gestiona las operaciones con la base de datos y permite interactuar con los datos de MongoDB haciendo referencia a modelos de Django. Por defecto, Django añade a cada clase de modelo un Manager denominado objects. Este Manager por defecto no es compatible con el método raw_aggregate(). Para utilizar este método específico de MongoDB, configura el campo objects de tu modelo en un administrador personalizado llamado MongoManager.

Los ejemplos de esta guía usan los modelos Movie y Theater, que representan colecciones en la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Estos modelos configuran explícitamente el campo objects para utilizar un MongoManager personalizado, en lugar de la clase Manager por defecto de Django. Esta guía también utiliza un modelo incrustado Location para representar el campo de ubicación del modelo Theater. Las clases de 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 la shell interactiva de Python para ejecutar los ejemplos de código. Para ingresar a la shell, ejecute el siguiente comando desde el directorio raíz de su 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 de Django que use el modelo Movie y el shell interactivo de Python para interactuar con documentos de MongoDB, visita el tutorial de Introducción a Django MongoDB Backend.

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

Tip

Para obtener más información sobre cómo construir pipelines de agregación, consulta Pipeline de agregación en el manual del servidor MongoDB.

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

Este ejemplo ejecuta una query bruta a la base de datos llamando al método raw_aggregate() en el MongoManager de tu modelo Movie, que consulta la colección sample_mflix.movies. El código pasa las siguientes etapas del pipeline 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 modelos diferidas, lo que significa que puedes cargar los campos omitidos en la etapa $project on-demand. En el ejemplo anterior, la query recupera los campos title y released. La instrucción print ejecuta una query independiente para recuperar el campo plot.

Tip

También puedes ejecutar MongoDB Search query utilizando las expresiones de búsqueda del backend MongoDB de Django. Para obtener más información, consulta la guía sobre cómo ejecutar una MongoDB Search query.

Puedes ejecutar queries MongoDB Search en tu base de datos para realizar búsquedas de texto detalladas. Estas queries ofrecen funcionalidades avanzadas de búsqueda, como coincidencia de frases, puntuación de resultados según relevancia y 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, consulta Índices de búsqueda en la guía Crear índices.

Este ejemplo ejecuta una query de MongoDB Search pasando la etapa de pipeline $search al método raw_aggregate(). El código realiza las siguientes acciones:

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

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

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

  • Incluye el campo title y el highlight, o el 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úrate de reemplazar el marcador <search-index-name> con el nombre de tu í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.

Se puede utilizar 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 **query** geoespacial, crea un índice de 2d o 2dsphere en campos que contengan datos geoespaciales. Luego, pasa uno de los siguientes operadores del query en un parámetro de la 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 el PointField definido en el modelo de muestra Location de esta guía. Para aprender cómo definir estos campos, consulta la guía Modelar datos geoespaciales.

Este ejemplo ejecuta una query geoespacial pasando las etapas de pipeline $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

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

  • Recupera e imprime los theaterId valores 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 deseas ejecutar operaciones de base de datos que ni la API QuerySet ni el método raw_aggregate() proporcionan, puedes operar directamente en tu MongoClient. Al trabajar con el MongoClient, se puede acceder a las operaciones de base de datos del controlador PyMongo. Teclee la siguiente sintaxis para exponer el MongoClient:

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

Reemplace el marcador de posición "<DATABASES key>" con la clave de su diccionario DATABASES que corresponda a su base de datos objetivo. Para usar tu base de datos por defecto, reemplaza el marcador de posición por "default".

Tip

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

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

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

Para obtener más información sobre MongoDB Search, consulte la 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