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
/ /
/ / /

Ejecuta una MongoDB Search query

En esta guía, puedes 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 modelos Theater, que representan las colecciones sample_mflix.movies y sample_mflix.theaters de los conjuntos de datos de muestra de Atlas. 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
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 la Guía dedatos geoespaciales modelo.

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 en string del modelo. Para conocer estas funcionalidades del modelo, consulta Definir 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
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 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.

Importante

Requisitos de índice

Antes de ejecutar una query de MongoDB Search, debes crear un índice de búsqueda en los campos relevantes. Para aprender cómo crear índices de búsqueda, consulta Índices de búsqueda en la guía Crear índices.

Para ejecutar una consulta de MongoDB Search, utiliza el método annotate() de la API QuerySet de Django. Pasa los criterios de MongoDB Search, incluido el 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, utiliza 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 de índices

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

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

Para utilizar este operador, pasa 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 de índices

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, pasa los siguientes argumentos al constructor SearchAutocomplete():

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

  • query: La input string a autocompletar. Puede especificar un valor de string o una instancia de Value.

  • fuzzy(Opcional) Un diccionario que habilita la coincidencia difusa 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, consulta 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 expresión SearchExists coincide con documentos en los que existe un campo específico. Esto corresponde al operador de MongoDB exists.

Para utilizar este operador, pasa 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 de índices

Antes de usar la expresión SearchIn en una consulta de búsqueda, crea un índice de búsqueda en el campo relevante. Si se está consultando un campo string, se debe indexar como el tipo de token. A partir de Django MongoDB Backend v5.2.2, puede utilizar el argumento field_mappings para crear este índice.

La expresión SearchIn coincide con los documentos en los que el valor de un campo está en una lista dada. Esto corresponde al operador in de MongoDB.

Para utilizar este operador, pasa 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 para hacer coincidir. Puedes especificar una lista de valores o una instancia Value.

  • 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, pasa los siguientes argumentos al constructor SearchPhrase():

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

  • query: La frase a hacer coincidir Puedes especificar un string o una lista de strings.

  • 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 el í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 operador SearchQueryString le permite realizar búsquedas de texto, comodines, expresiones regulares, difusas y de rango en los campos string. Esto corresponde al operador de queryString de MongoDB.

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

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

  • query: La string del query al estilo Lucene. Para obtener más información sobre la sintaxis de query de Lucene, consulta la documentación de Apache Lucene.

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

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 de índices

Antes de usar la expresión SearchRange en una consulta de búsqueda, crea un índice de búsqueda en el campo relevante. Si se está consultando un campo string, se debe indexar como el tipo de token. A partir de Django MongoDB Backend v5.2.2, puede utilizar el argumento field_mappings para crear este índice.

La expresión SearchRange busca valores dentro de un rango especificado. Se puede proporcionar un rango de valores numéricos, fechas, string o ObjectId. Esto corresponde al operador de rango de MongoDB.

Para utilizar este operador, pasa 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) Cota inferior exclusiva (>)

  • 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 de runtime entre 90 y 120 minutos.

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

La expresión SearchRegex coincide con los valores del campo string mediante una expresión regular. Esto corresponde al operador expresión regular de MongoDB.

Para utilizar este operador, pasa 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 en campos analizados. El valor por defecto es False.

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

El siguiente ejemplo usa 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 expresión SearchText realiza una búsqueda de texto completo en campos de string. Esto corresponde al operador de texto de MongoDB.

Para utilizar este operador, pasa 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 habilita la coincidencia difusa y permite configurar su comportamiento. Por ejemplo, puedes especificar {"maxEdits": 1} para permitir un cambio de un carácter antes de hacer coincidir el término de búsqueda.

  • match_criteriaOpcional: Se recomienda a los usuarios que tengan en cuenta si quieren que el sistema busque documentos que contengan "all" o "any" de los términos de búsqueda. El valor por defecto es "any".

  • synonyms: (Opcional) El nombre de una asignación de sinónimos definida en tu índice de 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 difusa 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, pasa 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 coincidir con cualquier secuencia de caracteres, y el carácter ?, para coincidir con cualquier carácter único.

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

  • 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 de índices

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, pasa los siguientes argumentos al constructor SearchGeoShape():

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

  • relationLa relación espacial para probar. Los valores válidos incluyen "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 usa 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 de índices

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, pasa 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 expresión SearchMoreLikeThis encuentra documentos similares a los ejemplos proporcionados. Esto corresponde al operador másComoEsto de MongoDB.

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

  • documents: Una lista de documentos de ejemplo o expresiones que sirven como referencias para la comparación 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 expresión CompoundExpression te permite utilizar la lógica booleana para combinar múltiples expresiones de búsqueda. Esto corresponde al operador compuesto de MongoDB.

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

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

  • should: Una lista de expresiones que los documentos deberían cumplir

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

  • filter:Una lista de expresiones que filtran los resultados

También puede 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 SearchScoreOption que configura la puntuación de relevancia

Este ejemplo usa la expresión CompoundExpression para consultar la colección sample_mflix.movies por documentos que cumplan 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 especificada

  • constant: Aplica una puntuación fija a todas las coincidencias

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

  • pathCalifica documentos en función del valor de un campo

Tip

Para aprender más sobre las puntuaciones de relevancia, consulte Puntuar 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 en MongoDB, véase Í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

En esta página