Overview
En esta guía, puedes aprender a usar el controlador de Scala para realizar operaciones de agregación.
Las operaciones de agregación procesan datos en tus colecciones de MongoDB y devuelven resultados calculados. El marco de agregación de MongoDB, que forma parte de la API de query, está basado en el concepto de pipelines de procesamiento de datos. Los documentos ingresan a un pipeline que contiene una o más etapas, y este pipeline transforma los documentos en un resultado agregado.
Tip
Tutoriales completos sobre agregación
Puedes encontrar tutoriales que proporcionan explicaciones detalladas de tareas de agregación comunes en el Tutoriales completos del pipeline de agregación en el manual del servidor. Selecciona un tutorial y luego elige Scala en el menú desplegable Select your language en la esquina superior derecha de la página.
Analogía
Una operación de agregación se asemeja a una fábrica de automóviles. Una fábrica de automóviles tiene una línea de ensamblaje, que contiene estaciones de ensamblaje con herramientas especializadas para realizar tareas específicas, como taladros y soldadores. Las piezas en bruto ingresan a la fábrica y luego la línea de montaje las transforma y ensambla en un producto terminado.
La pipeline de agregación es la cadena de ensamblaje, las etapas de agregación son las estaciones de ensamblaje y las expresiones de operadores son las herramientas especializadas.
Comparar las operaciones de agregación y búsqueda
La siguiente tabla muestra las diferentes tareas que pueden realizar las operaciones de búsqueda y las compara con lo que las operaciones de agregación pueden realizar. El marco de agregación proporciona funcionalidades ampliadas que permiten transformar y manipular tus datos.
Operaciones de búsqueda | Operaciones de agregación |
|---|---|
Select certain documents to return Select which fields to return Sort the results Limit the results Count the results | Select certain documents to return Select which fields to return Sort the results Limit the results Count the results Rename fields Compute new fields Summarize data Connect and merge data sets |
Limitaciones
Considera las siguientes limitaciones al realizar operaciones de agregación:
Los documentos devueltos no pueden violar el límite de tamaño de documento BSON de 16 megabytes.
Las etapas del pipeline tienen un límite de memoria de 100 megabytes por defecto. Puede sobrepasar este límite pasando un valor de
trueal métodoallowDiskUse()y encadenar el método conaggregate().La $graphLookup operadora tiene un límite estricto de memoria de 100 megabytes y omite el valor pasado al método
allowDiskUse().
Ejecutar operaciones de agregación
Nota
Datos de muestra
Los ejemplos de esta guía utilizan la colección restaurants en la base de datos sample_restaurants 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.
Para realizar una agregación, pasa una lista que contenga las etapas de la pipeline al método aggregate(). El driver de Scala proporciona la clase Aggregates, que incluye métodos asistentes para construir etapas del pipeline.
Para aprender más sobre las etapas de pipeline y sus métodos asistentes Aggregates correspondientes, consulta los siguientes recursos:
Aggregation Stages en el manual del servidor de MongoDB
Agregados en la documentación de la API
Filtrar, agrupar y contar documentos
Este ejemplo de código produce un recuento del número de panaderías en cada distrito de Nueva York. Para ello, llama al método aggregate() y pasa un pipeline de agregación como una lista de etapas. El código construye estas etapas utilizando los siguientes métodos asistente Aggregates:
filter(): Compila la fase $match para filtrar documentos que tienen un valor decuisinede"Bakery"group(): Construye la etapa $group para agrupar los documentos coincidentes por el campoborough, acumulando un recuento de documentos para cada valor distinto
val pipeline = Seq(Aggregates.filter(Filters.equal("cuisine", "Bakery")), Aggregates.group("$borough", Accumulators.sum("count", 1)) ) collection.aggregate(pipeline) .subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"_id": "Brooklyn", "count": 173} {"_id": "Queens", "count": 204} {"_id": "Bronx", "count": 71} {"_id": "Staten Island", "count": 20} {"_id": "Missing", "count": 2} {"_id": "Manhattan", "count": 221}
Explica una agregación
Para ver información sobre cómo MongoDB ejecuta tu operación, puedes indicarle al planificador de consultas de MongoDB que la explique. Cuando MongoDB explica una operación, devuelve los planes de ejecución y las estadísticas de rendimiento. Un plan de ejecución es una forma potencial en la que MongoDB puede completar una operación. Cuando indicas a MongoDB que explique una operación, por defecto te devuelve tanto el plan que ejecutó como los planes de ejecución rechazados.
Para explicar una operación de agregación, encadena el método explain() al método aggregate(). Puedes pasar un nivel de verbosidad a explain(), lo que modifica el tipo y la cantidad de información que devuelve el método. Para obtener más información sobre nivel de verbosidad, consulta Modos de nivel de verbosidad en el manual de MongoDB Server.
El siguiente ejemplo instruye a MongoDB para que explique la operación de agregación a partir del ejemplo anterior Filtrar, agrupar y contar documentos. El código pasa un valor de nivel de verbosidad de ExplainVerbosity.EXECUTION_STATS al método explain(), que configura el método para devolver estadísticas que describen la ejecución del plan ganador:
val pipelineToExplain = Seq(Aggregates.filter(Filters.equal("cuisine", "Bakery")), Aggregates.group("$borough", Accumulators.sum("count", 1)) ) collection.aggregate(pipelineToExplain) .explain(ExplainVerbosity.EXECUTION_STATS) .subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"explainVersion": "2", "queryPlanner": {"namespace": "sample_restaurants.restaurants", "indexFilterSet": false, "parsedQuery": {"cuisine": {"$eq": "Bakery"}}, "queryHash": "865F14C3", "planCacheKey": "0FC225DA", "optimizedPipeline": true, "maxIndexedOrSolutionsReached": false, "maxIndexedAndSolutionsReached": false, "maxScansToExplodeReached": false, "winningPlan": {"queryPlan": {"stage": "GROUP", "planNodeId": 3, "inputStage": {"stage": "COLLSCAN", "planNodeId": 1, "filter": {"cuisine": {"$eq": "Bakery"}}, "direction": "forward"}}, ...}
Ejecutar una búsqueda de texto completo con MongoDB Search
Tip
Solo disponible para colecciones con un índice de búsqueda de MongoDB
Este operador de la pipeline de agregación solo está disponible para las colecciones que tienen un índice de búsqueda de MongoDB.
Para especificar una búsqueda de texto completo en uno o más campos, puedes crear una etapa de pipeline $search. El **driver** Scala proporciona el método **asistente** Aggregates.search() para crear esta etapa. El método search() requiere los siguientes argumentos:
SearchOperatorinstancia: Especifica el campo y el texto que se va a buscar.SearchOptionsinstancia: Especifica las opciones para personalizar la búsqueda de texto completo. Debes configurar la opciónindexcon el nombre del índice de búsqueda de MongoDB a utilizar.
Este ejemplo crea etapas de pipeline para realizar las siguientes acciones:
Busca en el campo
nameel texto que contenga la palabra"Salt"Proyecte solo los valores de
_idynamede los documentos coincidentes
val operator = SearchOperator.text(SearchPath.fieldPath("name"), "Salt") val options = searchOptions().index("<search index name>") val pipeline = Seq(Aggregates.search(operator, options), Aggregates.project(Projections.include("name"))) collection.aggregate(pipeline) .subscribe((doc: Document) => println(doc.toJson()), (e: Throwable) => println(s"There was an error: $e"))
{"_id": {"$oid": "..."}, "name": "Fresh Salt"} {"_id": {"$oid": "..."}, "name": "Salt & Pepper"} {"_id": {"$oid": "..."}, "name": "Salt + Charcoal"} {"_id": {"$oid": "..."}, "name": "A Salt & Battery"} {"_id": {"$oid": "..."}, "name": "Salt And Fat"} {"_id": {"$oid": "..."}, "name": "Salt And Pepper Diner"}
Importante
Para ejecutar el ejemplo anterior, debe crear un índice de MongoDB Search en la colección restaurants que abarque el campo name. Luego, reemplaza el marcador de posición "<search index name>" con el nombre del índice. Para saber más acerca de los índices de búsqueda de MongoDB, consulte el Guía de Índices de búsqueda de MongoDB.
Métodos asistentes del operador 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 MongoDB Search, consulte la guía Índices de MongoDB Search.
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")) val aggregatePipelineStages = Seq(searchStage, projectStage) collection.aggregate(aggregatePipelineStages) .subscribe((doc: Document) => println(doc.toJson()), (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
Manual del Servidor de MongoDB
Para aprender más sobre los temas tratados en esta guía, consulta las siguientes páginas del manual del servidor MongoDB:
Para obtener una lista completa de las etapas de agregación, consulta Etapas de agregación en el manual de MongoDB Server.
Para aprender sobre cómo armar un pipeline de agregación y para ver ejemplos, consulta pipeline de agregación.
Para obtener más información sobre cómo crear etapas de pipeline, consulta Etapas de agregación.
Para obtener más información sobre cómo explicar las operaciones de MongoDB, consulta Resultado de explicación y Planes de consultas.
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: