Overview
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.
API de consulta
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.
Datos de muestra
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.
Ejecutar ejemplos de código
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.
Ejecutar consultas sin procesar
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:
Campos de filtro y documentos del proyecto
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 campotitlede"The Parent Trap"$project: Incluye los campostitleyreleasedde 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.
Ejecuta una MongoDB Search query
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
plotQueries para documentos cuyos valores de
plotcontienen la string"whirlwind romance"con no más de3palabras entre ellosDevuelve partes de los valores de cadena
plotque coinciden con la query y metadatos que indican dónde se produjeron las coincidenciasIncluye el campo
titley elhighlight, 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.
Query datos geoespaciales
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.geoalmacena una ubicación dentro del área de ChicagoRecupera e imprime los
theaterIdvalores 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
Operaciones de MongoClient
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.
Información Adicional
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.