Docs Menu
Docs Home
/ /
/ / /

Ejecutar una consulta de búsqueda de MongoDB

En esta guía, puede aprender a usar Django MongoDB Backend para ejecutar Consultas deMongoDB Search en una colección. MongoDB Search permite realizar búsquedas de texto completo en las colecciones de MongoDB. Los índices de MongoDB Search especifican el comportamiento de la búsqueda y los campos que se indexan.

Los ejemplos de esta guía utilizan el Movie y los Theater modelos, que representan las colecciones y de los sample_mflix.movies sample_mflix.theaters conjuntos de datos de muestra del Atlas. 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
class Movie(models.Model):
title = models.CharField(max_length=200)
plot = models.TextField(blank=True)
runtime = models.IntegerField(default=0)
genres = ArrayField(models.CharField(max_length=100), null=True, blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title
class Theater(models.Model):
theater_id = models.IntegerField(default=0, db_column="theaterId")
geo = models.PointField(db_column="location.geo")
class Meta:
db_table = "theaters"
managed = False
def __str__(self):
return self.theater_id

Tip

Campos de GeoDjango

El modelo Theater utiliza un GeoDjango PointField llamado geo para almacenar datos geoespaciales. Para obtener más información sobre los campos de GeoDjango, consulte Guía dedatos geoespaciales modelo.

Los Movie Theater modelos y incluyen una Meta clase interna, que especifica los metadatos del modelo, y un __str__() método, que define la representación de cadena del modelo. Para obtener más información sobre estas características del modelo,consulte "Definir 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
from django_mongodb_backend.expressions import (
SearchEquals, SearchAutocomplete, SearchExists, SearchIn,
SearchPhrase, SearchQueryString, SearchRange, SearchRegex,
SearchText, SearchWildcard, SearchGeoShape, SearchGeoWithin,
SearchMoreLikeThis, CompoundExpression, SearchScoreOption
)

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.

Importante

Requisitos del índice

Antes de ejecutar una consulta de búsqueda de MongoDB, debe crear un índice de búsqueda en los campos correspondientes. Para saber cómo crear índices de búsqueda, consulte "Índices de búsqueda" en la guía "Crear índices".

Para ejecutar una consulta de búsqueda de MongoDB, use el método annotate() de la API QuerySet de Django. Pase sus criterios de búsqueda de MongoDB, incluyendo su operador de búsqueda, como argumento score a annotate(). El siguiente código muestra la sintaxis básica para ejecutar una consulta de búsqueda:

Model.objects.annotate(
score=<Search Operator>(path="<field name", <additional arguments>)
)

Para especificar operadores de búsqueda, utilice las clases de expresión proporcionadas por el módulo django_mongodb_backend.expressions. Cada clase corresponde a un operador de búsqueda.

Las siguientes secciones muestran cómo ejecutar consultas de búsqueda utilizando cada clase de expresión compatible.

Importante

Requisitos adicionales del índice

Antes de usar la SearchEquals expresión en una consulta de búsqueda, cree un índice de búsqueda que indexe el campo relevante como tipo de token. A partir de Django MongoDB Backend v,5.2.2 puede usar el argumento field_mappings para crear este índice.

La SearchEquals expresión coincide con los documentos en los que un campo es igual a un valor especificado. Esto corresponde al operador "igual" de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchEquals():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • value: El valor a coincidir. Puedes especificar un valor de string o una instancia Value

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza el operador SearchEquals para consultar la colección sample_mflix.movies para documentos que tengan un valor title de "Finding Nemo":

Movie.objects.annotate(score=SearchEquals(path="title", value="Finding Nemo"))

Importante

Requisitos adicionales del índice

Antes de usar la SearchAutocomplete expresión en una consulta de búsqueda, cree un índice de búsqueda que indexe el campo relevante como tipo de autocompletado. A partir de Django MongoDB Backend v,5.2.2 puede usar el argumento field_mappings para crear este índice.

La SearchAutocomplete expresión busca una palabra o frase que contenga una secuencia de caracteres de una cadena de entrada incompleta. Esto corresponde al operador de autocompletado de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchAutocomplete():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • queryCadena de entrada que se autocompletará. Puede especificar un valor de cadena o una instancia Value de.

  • fuzzy: (Opcional) Un diccionario que permite la coincidencia aproximada y permite configurar su comportamiento. Por ejemplo, puede especificar {"maxEdits": 1} para permitir un cambio de carácter antes de que coincida con el término de búsqueda. Para ver todos los valores disponibles, consulte las opciones de autocompletado en la documentación de MongoDB Atlas.

  • token_order: (Opcional) Una cadena que configura el comportamiento de la secuencia de tokens. Puede establecer este valor "sequential" en "any" o.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchAutocomplete para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor title que comience con "First":

Movie.objects.annotate(score=SearchAutocomplete(path="title", query="First"))

La SearchExists expresión coincide con los documentos que contienen un campo especificado. Esto corresponde al operador "exist" de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchExists():

  • pathNombre del campo que se va a buscar. Puede especificar un valor de cadena o una instancia F de.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchExists para consultar la colección sample_mflix.movies en busca de documentos que tengan un campo plot:

Movie.objects.annotate(score=SearchExists(path="plot"))

Importante

Requisitos adicionales del índice

Antes de usar la SearchIn expresión en una consulta de búsqueda, cree un índice de búsqueda en el campo correspondiente. Si consulta un string campo, debe indexarlo como token. A partir de la versión 7300 de Django MongoDB Backend,5.2.2 puede usar el argumento field_mappings para crear este índice.

La SearchIn expresión coincide con los documentos cuyo valor de campo se encuentra en una lista dada. Esto corresponde al operador "in" de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchIn():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • valueLa lista de valores que se deben buscar. Puede especificar una lista de valores o una Value instancia.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchIn para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor runtime de 100, 200 o 300 minutos:

Movie.objects.annotate(score=SearchIn(path="runtime", value=[100, 200, 300]))

La SearchPhrase expresión coincide con secuencias exactas o casi exactas de términos en un campo. Esto corresponde al operador de frase de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchPhrase():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • queryLa frase que se busca. Puede especificar una cadena o una lista de cadenas.

  • slop: (Opcional) El número máximo de términos permitidos entre términos de frases.

  • synonyms: (Opcional) El nombre de una asignación de sinónimos definida en su índice de búsqueda.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchPhrase para consultar la colección sample_mflix.movies en busca de documentos que tengan la frase "space adventure" en su campo plot, permitiendo hasta 2 palabras entre estos términos:

Movie.objects.annotate(score=SearchPhrase(path="plot", query="space adventure", slop=2))

El SearchQueryString operador permite realizar búsquedas de texto, comodines, expresiones regulares, difusas y de rango en los string campos. Esto corresponde al operador queryString de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchQueryString():

El siguiente ejemplo utiliza la expresión SearchQueryString para consultar la colección sample_mflix.movies en busca de documentos que coincidan con una consulta de estilo Lucene en el campo plot:

Movie.objects.annotate(score=SearchQueryString(path="plot", query="romance AND (paris OR tokyo)"))

Importante

Requisitos adicionales del índice

Antes de usar la SearchRange expresión en una consulta de búsqueda, cree un índice de búsqueda en el campo correspondiente. Si consulta un string campo, debe indexarlo como token. A partir de la versión 7300 de Django MongoDB Backend,5.2.2 puede usar el argumento field_mappings para crear este índice.

La SearchRange expresión busca valores dentro de un rango específico. Puede proporcionar un rango de valores numéricos, de fecha, de cadena ObjectId o. Esto corresponde al operador de rango de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchRange():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • lt: (Opcional) Límite superior exclusivo< ()

  • lte: (Opcional) Límite superior inclusivo<= ()

  • gt: (Opcional) Límite inferior exclusivo> ()

  • gte: (Opcional) Límite inferior inclusivo>= ()

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchRange para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor runtime entre 90 y 120 minutos.

Movie.objects.annotate(score=SearchRange(path="runtime", gt=90, lt=120))

La SearchRegex expresión coincide con los valores de los campos de cadena mediante una expresión regular. Esto corresponde al operador regex de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchRegex():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • query:La cadena de expresión regular utilizada para buscar el contenido del campo.

  • allow_analyzed_field: (Opcional) Un valor booleano que indica si se permite la coincidencia con los campos analizados. El valor predeterminado False es.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchRegex para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor title que incluya la palabra "winter":

Movie.objects.annotate(score=SearchRegex(path="title", query=r".*winter.*"))

La SearchText expresión realiza una búsqueda de texto completo en campos de cadena. Esto corresponde al operador de texto de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchText():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • query:El término o frase de búsqueda.

  • fuzzy: (Opcional) Un diccionario que permite la coincidencia aproximada y permite configurar su comportamiento. Por ejemplo, puede especificar {"maxEdits": 1} para permitir un cambio de carácter antes de que coincida con el término de búsqueda.

  • match_criteria: (Opcional) Si se buscan documentos que contengan "all" o "any" de los términos de búsqueda. El valor predeterminado "any" es.

  • synonyms: (Opcional) El nombre de una asignación de sinónimos definida en su índice Atlas.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchText para consultar la colección sample_mflix.movies en busca de documentos que tengan "sudden disappearance" en su campo plot, con coincidencia aproximada habilitada:

Movie.objects.annotate(score=SearchText(
path="plot",
query="sudden disappearance",
fuzzy={"maxEdits": 2},
match_criteria="all"
))

La SearchWildcard expresión coincide con cadenas mediante patrones comodín. Esto corresponde al operador comodín de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchWildcard():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • query:Una cadena comodín que puede incluir el carácter *, para que coincida con cualquier secuencia de caracteres, y el carácter ?, para que coincida con cualquier carácter individual.

  • allow_analyzed_field: (Opcional) Un valor booleano que permite la coincidencia con los campos analizados. El valor predeterminado False es.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchWildcard para consultar la colección sample_mflix.movies en busca de documentos que tengan un title que comience con "Star" y termine con cualquier carácter:

Movie.objects.annotate(score=SearchWildcard(path="title", query="Star*"))

Importante

Requisitos adicionales del índice

Antes de usar la SearchGeoShape expresión en una consulta de búsqueda, cree un índice de búsqueda que indexe el campo relevante como tipo geográfico con la indexShapes propiedad establecida true en. A partir de Django MongoDB Backend v,5.2.2 puede usar el argumento field_mappings para crear este índice.

La SearchGeoShape expresión filtra documentos según sus relaciones espaciales con una forma. Esto corresponde al operador geoShape de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchGeoShape():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • relationRelación espacial a probar. Los valores válidos son "within", "intersects" y "disjoint".

  • geometry:Un objeto de geometría GeoJSON para comparar.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchGeoShape para consultar la colección sample_mflix.theaters en busca de documentos que tengan un valor geo dentro de un polígono especificado:

chicago = {
"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.annotate(score=SearchGeoShape(
path="geo",
relation="within",
geometry=chicago
))

Importante

Requisitos adicionales del índice

Antes de usar la SearchGeoWithin expresión en una consulta de búsqueda, cree un índice de búsqueda que indexe el campo de consulta como tipo geográfico. A partir de la versión 7200 de Django MongoDB Backend,5.2.2 puede usar el argumento field_mappings para crear este índice.

La SearchGeoWithin expresión filtra documentos con campos geográficos dentro de una forma específica. Esto corresponde al operador geoWithin de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchGeoWithin():

  • pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instancia F de.

  • kind:El tipo de geometría GeoJSON: "circle", "box" o "geometry".

  • geometry:La geometría GeoJSON que define el límite espacial.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza el operador SearchGeoWithin para consultar la colección sample_mflix.theaters en busca de documentos que tengan un valor geo dentro de un círculo especificado:

circle = {
"center": {"type": "Point", "coordinates": [-73.98, 40.75]},
"radius": 5000
}
theaters = Theater.objects.annotate(score=SearchGeoWithin(
path="geo",
kind="circle",
geometry=circle
))

La SearchMoreLikeThis expresión busca documentos similares a los ejemplos proporcionados. Esto corresponde al operador moreLikeThis de MongoDB.

Para utilizar este operador, pase los siguientes argumentos al constructor SearchMoreLikeThis():

  • documents:Una lista de documentos o expresiones de ejemplo que sirven como referencias de similitud.

  • score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.

El siguiente ejemplo utiliza la expresión SearchMoreLikeThis para consultar la colección sample_mflix.movies en busca de documentos que sean similares a un documento de ejemplo proporcionado:

Movie.objects.annotate(score=SearchMoreLikeThis([
{"title": "The Godfather"}, {"genres": ["Crime", "Drama"]}
]))

Puede realizar consultas de búsqueda de MongoDB que combinen múltiples expresiones de búsqueda de las siguientes maneras:

La CompoundExpression expresión permite usar lógica booleana para combinar varias expresiones de búsqueda. Esto corresponde al operador compuesto de MongoDB.

Debe pasar uno o más de los siguientes argumentos al constructor CompoundExpression():

  • must:Una lista de expresiones con las que deben coincidir los documentos

  • should:Una lista de expresiones con las que los documentos deben coincidir

  • must_not:Una lista de expresiones con las que los documentos no deben coincidir

  • filter:Una lista de expresiones que filtran los resultados

También puedes pasar los siguientes argumentos opcionales:

  • minimum_should_match:El número mínimo de cláusulas should que deben coincidir los documentos

  • score:Una instancia de SearchScoreOption que configura la puntuación de relevancia

Este ejemplo utiliza la expresión CompoundExpression para consultar la colección sample_mflix.movies en busca de documentos que coincidan con los siguientes criterios:

  • plot el campo existe

  • plot El campo contiene el texto "fast-paced"

  • genres El campo no contiene ni "Romance" ni "Comedy"

plot_exists = SearchExists(path="plot")
plot_text = SearchText(path="plot", query="fast-paced")
genres_range = SearchIn(path="genres", value=["Romance", "Comedy"])
Movie.objects.annotate(
score=CompoundExpression(
must=[plot_exists, plot_text],
must_not=[genres_range]
)
)

Puedes usar los siguientes operadores bit a bit para combinar expresiones de búsqueda:

  • &: Representa una operación AND lógica

  • |: Representa una operación OR lógica

  • ~: Representa una operación lógica NOT

Este ejemplo usa el operador | para consultar la colección sample_mflix.movies en busca de documentos que coincidan con uno o ambos de los siguientes criterios:

  • plot El campo contiene el texto "heartwarming"

  • genres El campo contiene "Romance" o "Comedy"

expr = SearchText(path="plot", query="heartwarming") | SearchIn(path="genres", value=["Romance", "Comedy"])
Movie.objects.annotate(score=expr)

MongoDB asigna una puntuación de relevancia a cada documento devuelto en una consulta de búsqueda. Los documentos incluidos en un conjunto de resultados se ordenan de mayor a menor puntuación de relevancia.

Puede usar la expresión SearchScoreOption para personalizar cómo MongoDB calcula y aplica las puntuaciones de relevancia. El constructor SearchScoreOption() acepta los siguientes argumentos:

  • boost:Aumenta la puntuación de los documentos que coinciden con una expresión específica

  • constant:Aplica una puntuación fija a todos los partidos

  • function:Aplica una función para calcular la puntuación

  • path:Puntúa los documentos según el valor de un campo

Tip

Para obtener más información sobre las puntuaciones de relevancia, consulte Puntuación de los documentos en los resultados en la documentación de MongoDB Atlas.

El siguiente ejemplo aumenta la puntuación de relevancia de los documentos que coinciden con la expresión SearchEquals por un factor de 3:

boost = SearchScoreOption({"boost": {"value": 3}})
Movie.objects.annotate(
score=SearchEquals(
path="title",
value="Life of Pi",
score=boost
)
)

Para obtener más información sobre la creación de índices de búsqueda de MongoDB, consulte Índices de búsqueda en la guía Crear índices.

Para obtener más información sobre las consultas de búsqueda de MongoDB, consulte Descripción general de búsqueda de MongoDB en la documentación de MongoDB Atlas.

Volver

Realizar consultas en bruto