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 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.
Datos de muestra
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.
Ejecutar ejemplos de código
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.
Ejecutar consultas sin procesar
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:
Campos de filtro y documentos del proyecto
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 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 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.
Ejecutar una consulta de búsqueda de MongoDB
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
plotConsultas de documentos cuyos valores
plotcontienen la cadena"whirlwind romance"con no más de3palabras entre ellosDevuelve partes de los valores de la cadena
plotque coinciden con la consulta y los metadatos que indican dónde ocurrieron las coincidenciasIncluye el campo
titley elhighlight, 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.
Consultar 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.
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.geoalmacena una ubicación dentro del área de ChicagoRecupera e imprime los valores
theaterIdde 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 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.
Información Adicional
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.