Overview
En esta guía, aprenderá a usar el controlador de Scala para ejecutar consultas de búsqueda de MongoDB en una colección. La búsqueda de MongoDB permite realizar búsquedas de texto completo en las colecciones. Los índices de búsqueda de MongoDB especifican el comportamiento de la búsqueda y los campos que se indexarán.
Para aprender a crear y administrar índices de búsqueda de MongoDB mediante el controlador Scala, consulte la guía de índices de búsqueda de MongoDB y de búsqueda vectorial de MongoDB.
Datos de muestra
Los ejemplos de esta guía utilizan la colección movies en la base de datos sample_mflix de los conjuntos de datos de ejemplo de Atlas. Para aprender cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Comienza con Atlas.
Ejecuta una MongoDB Search query
Nota
MongoDB Search está disponible en las siguientes implementaciones:
MongoDB Atlas v4.2 o posterior
MongoDB Community Edition v8.2 o posterior
Para ejecutar consultas de búsqueda de MongoDB, su colección debe tener un índice de búsqueda de MongoDB. Para obtener información sobre cómo crear un índice de búsqueda de MongoDB, consulte la guía de índices de búsqueda de MongoDB y de búsqueda vectorial de MongoDB.
Para realizar una búsqueda de texto completo, llame al método aggregate() con una etapa de canalización $search. El controlador de Scala proporciona el método auxiliar Aggregates.search() para crear esta etapa. El método search() requiere los siguientes argumentos:
SearchOperatorinstancia que especifica el campo y el texto a buscarSearchOptionsinstancia que especifica opciones para personalizar la búsqueda, incluido el nombre del índice de búsqueda de MongoDB que se utilizará.
El siguiente ejemplo busca el texto "Alabama" en el campo title y proyecta solo el campo _id, que se incluye por defecto, y el campo title de los documentos coincidentes:
val operator = SearchOperator.text( SearchPath.fieldPath("title"), "Alabama") val options = searchOptions().index("<search index name>") val pipeline = Seq( Aggregates.search(operator, options), Aggregates.project(Projections.include("title")) ) try { Await .result(collection.aggregate(pipeline).toFuture(), 20.seconds) .foreach((doc: Document) => println(doc.toJson())) } catch { case e: Throwable => println(s"There was an error: $e") }
{"_id": {"$oid": "..."}, "title": "Alabama Moon"} {"_id": {"$oid": "..."}, "title": "Crazy in Alabama"} {"_id": {"$oid": "..."}, "title": "Sweet Home Alabama"}
Tip
Para ver los tutoriales de búsqueda de MongoDB en la documentación de Atlas, consulte Ejecutar consultas de búsqueda de Atlas.
MongoDB Search metadatos
Nota
Los metadatos de búsqueda de MongoDB están disponibles en las siguientes implementaciones:
MongoDB Atlas v4.4.11 o posterior
MongoDB Community Edition v8.2 o posterior
Utilice el método auxiliar Aggregates.searchMeta() para recuperar únicamente los metadatos de una consulta de búsqueda de MongoDB sin devolver los resultados de la búsqueda. El siguiente ejemplo devuelve los metadatos de una consulta que busca en el campo year valores cercanos a 2010:
try { Await .result( collection.aggregate(Seq( Aggregates.searchMeta( SearchOperator.near(2010, 1, SearchPath.fieldPath("year"))) )).toFuture(), 20.seconds ) .foreach((doc: Document) => println(doc.toJson())) } catch { case e: Throwable => println(s"There was an error: $e") }
{"count": {"lowerBound": 35}}
Utilice operadores de búsqueda
El driver Scala proporciona métodos asistentes para los siguientes operadores:
Operador | Descripción |
|---|---|
Realiza una búsqueda de una palabra o frase que contenga una secuencia de caracteres de una string de entrada incompleta. | |
Combina dos o más operadores en una única query. | |
Verifica si un campo coincide con un valor que especificaste. Se asigna a los métodos | |
Verifica si existe una ruta hacia un nombre de campo indexado especificado en un documento. | |
Realiza una búsqueda de un arreglo de valores de número, fecha, booleano, objectId, uuid o string BSON en la ruta determinada y retorna documentos donde el valor del campo coincide con cualquier valor en el arreglo especificado. | |
Devuelve documentos similares a los documentos de entrada. | |
Permite consultar y puntuar valores numéricos, fechas y valores de puntos GeoJSON. | |
Realiza una búsqueda de documentos que contienen una secuencia ordenada de términos utilizando el analizador especificado en la configuración del índice. | |
Brinda soporte a las queries de una combinación de campos indexados y valores. | |
Permite la consulta y la calificación de valores numéricos, de fecha y de string. Se asigna a los métodos | |
Interpreta el campo de query como una expresión regular. | |
Realiza una búsqueda de texto completo utilizando el analizador que se especifique en la configuración del índice. | |
Permite consultas que utilizan caracteres especiales en la string de búsqueda que pueden coincidir con cualquier carácter. |
Ejemplo de etapa de búsqueda en el pipeline
Antes de que puedas ejecutar este ejemplo, debes crear un índice de búsqueda de MongoDB en la colección movies que tenga la siguiente definición:
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
Para obtener más información sobre cómo crear índices de búsqueda de MongoDB, consulte la guía de índices de búsqueda de MongoDB y de búsqueda vectorial de MongoDB.
El siguiente código crea un escenario $search que tiene las siguientes especificaciones:
Comprueba que el arreglo
genresincluya"Comedy"Busca en el campo
fullplotla frase"new york"Coincide con
yearvalores entre1950y2000, ambos inclusiveBusca valores de
titleque comiencen con el término"Love"
val searchStage = Aggregates.search( SearchOperator.compound() .must( Iterable( SearchOperator.in(fieldPath("genres"), List("Comedy")), SearchOperator.phrase(fieldPath("fullplot"), "new york"), SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000), SearchOperator.wildcard("Love *", fieldPath("title")), ).asJava ) ) val projectStage = Aggregates.project( Projections.include("title", "year", "genres")) try { Await .result( collection.aggregate(Seq(searchStage, projectStage)).toFuture(), 20.seconds ) .foreach((doc: Document) => println(doc.toJson())) } catch { case e: Throwable => println(s"There was an error: $e") }
{"_id": ..., "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979} {"_id": ..., "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994}
Para obtener más información sobre los métodos asistente de MongoDB Search, consulta la referencia de la interfaz SearchOperator en la documentación de Core API del driver.
Información Adicional
Para obtener más información sobre la búsqueda en MongoDB, consulte la sección "Descripción general de la búsqueda en MongoDB" en la documentación de Atlas.
Documentación de la API
Para obtener más información sobre los métodos y tipos tratados en esta guía, consulta la siguiente documentación de la API: