Overview
En esta guía, puedes aprender cómo ejecutar una query de texto en el driver MongoDB Kotlin.
Puede utilizar una query de texto para recuperar documentos que contengan un término o una frase en un campo especificado. Un término es una secuencia de caracteres que excluye los caracteres de espacio en blanco. Una frase es una secuencia de términos con cualquier número de caracteres de espacio en blanco.
Las siguientes secciones muestran cómo realizar los siguientes tipos de consultas de texto:
Query texto por un término
Query texto por una frase
Query de texto con términos excluidos
Si quieres ordenar los resultados de tu query de texto, consulta el Sección de text query de nuestra guía Ordenar resultados.
Documentos de muestra
Las siguientes secciones incluyen ejemplos de text query en la
fast_and_furious_movies colección. Cada sección utiliza una variable llamada collection para referirse a la instancia MongoCollection de la colección fast_and_furious_movies.
La colección fast_and_furious_movies contiene documentos que describen una de las varias películas que forman parte de la franquicia de películas Rápidos y Furiosos. Cada documento contiene un campo de título y un campo de etiquetas.
{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] } { "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] } { "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
Estos datos se modelan con la siguiente clase de datos de Kotlin:
data class Movies( val id: Int, val title: String, val tags: List<String> )
Text Index
Debe crear un índice de texto antes de ejecutar una query de texto. Un índice de texto especifica el campo de string o arreglo de strings en el que ejecutar una query de texto.
En los siguientes ejemplos, ejecuta consultas de texto en el campo title en la colección fast_and_furious_movies. Para habilitar consultas de texto en el campo title, cree un índice de texto usando el generador de Índices con el siguiente snippet:
collection.createIndex(Indexes.text("title"))
Para obtener más información, consulta los siguientes recursos:
Sección Índices de texto de nuestra guía de Índices
Índices de Texto Entrada del Manual del Servidor
Text query
Utilice el método Filters.text() para especificar una consulta de texto.
El método Filters.text() utiliza el creador de filtro para definir un filtro de query que especifica qué buscar durante la query de texto. El filtro de query se representa mediante una instancia BSON. Pasa el filtro de query al método find() para ejecutar una query de texto.
Cuando ejecutes el método find(), MongoDB ejecuta una query de texto en todos los campos indexados mediante el índice de texto en la colección. MongoDB devuelve documentos que contienen uno o más de los términos de query y una puntuación de relevancia para cada resultado. Para obtener más información sobre las puntuaciones de relevancia, consulta la sección Query de texto en nuestra guía de resultados de clasificación.
Especificar opciones
Puede incluir TextSearchOptions como segundo parámetro del método Filters.text() para especificar opciones de consulta de texto como la sensibilidad a mayúsculas y minúsculas. Por defecto, las queries de texto se ejecutan sin sensibilidad a mayúsculas y minúsculas, lo que significa que la query coincide con valores en minúsculas y mayúsculas.
Para especificar una query que distinga entre mayúsculas y minúsculas, usa el siguiente snippet:
val options: TextSearchOptions = TextSearchOptions().caseSensitive(true) val filter = Filters.text("SomeText", options)
Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de la API:
Query texto por un término
Pase un término como string al método Filters.text() para especificar el término en su text query.
Ejemplo
El siguiente ejemplo ejecuta una query de texto en los documentos de la colección fast_and_furious_movies para los títulos que contienen el término "rápido":
val filter = Filters.text("fast") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=1, title=2 Fast 2 Furious, tags=[undercover, drug dealer]) Movies(id=2, title=Fast 5, tags=[bank robbery, full team])
Para hacer coincidir varios términos en tu query de texto, separa cada término con espacios en el método generador Filters.text(). El método builder devuelve la query de texto como una instancia de Bson. Cuando pasas esto al método find(), devuelve documentos que coinciden con cualquiera de los términos.
Ejemplo
El siguiente ejemplo ejecuta una query de texto en los documentos de la colección fast_and_furious_movies para títulos que contienen los términos "destino" o "7":
val filter = Filters.text("fate 7") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=3, title=Furious 7, tags=[emotional]) Movies(id=4, title=The Fate of the Furious, tags=[betrayal])
Query texto por una frase
Pasa una frase con comillas escapadas al método Filters.text() para especificar la frase en tu query de texto. Las comillas escapadas son caracteres de comillas dobles precedidos de una barra invertida. Si no añades comillas escapadas alrededor de la frase, el método find() ejecuta una búsqueda de términos.
Ejemplo
El siguiente ejemplo ejecuta una query de texto en los documentos de la colección fast_and_furious_movies en busca de títulos que contengan la frase "el destino de los furiosos":
val filter = Filters.text("\"fate of the furious\"") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=4, title=The Fate of the Furious, tags=[betrayal])
Query de texto con términos excluidos
Para cada término que desees excluir de tu query de texto, anteponle un signo menos en la cadena que envíes al método generador Filters.text().
Ninguno de los documentos devueltos por la query contiene el término excluido en su campo de índice de texto.
Importante
Debe tener al menos un término de query de texto si desea excluir términos de su query.
Ejemplo
El siguiente ejemplo ejecuta una query de texto en los documentos de la colección fast_and_furious_movies para títulos que contengan el término "furioso", pero no contengan el término "rápido":
val filter = Filters.text("furious -fast") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=3, title=Furious 7, tags=[emotional]) Movies(id=4, title=The Fate of the Furious, tags=[betrayal])