Overview
En esta guía, puede aprender a utilizar el controlador Scala para realizar operaciones de agregación.
Las operaciones de agregación procesan los datos de sus colecciones de MongoDB y devuelven resultados calculados. El marco de agregación de MongoDB, que forma parte de la API de consultas, se basa en el concepto de canalizaciones de procesamiento de datos. Los documentos entran en una canalización que contiene una o más etapas, y esta canalización los transforma en un resultado agregado.
Tip
Tutoriales completos sobre agregación
Puede encontrar tutoriales que brindan explicaciones detalladas de tareas de agregación comunes en Sección completa de tutoriales decanalización de agregación del manual del servidor. Seleccione un tutorial y luego seleccione Scala desde el menú desplegable Select your language en la esquina superior derecha de la página.
Analogía
Una operación de agregación es similar a una fábrica de automóviles. Una fábrica de automóviles cuenta con 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 entran en la fábrica y luego la línea de ensamblaje las transforma y ensambla en un producto terminado.
La tubería de agregación es la línea de ensamblaje, las etapas de agregación son las estaciones de ensamblaje y las expresiones del operador son las herramientas especializadas.
Comparar las operaciones de agregación y búsqueda
La siguiente tabla enumera las diferentes tareas que pueden realizar las operaciones de búsqueda y las compara con las de agregación. El marco de agregación ofrece una funcionalidad ampliada que permite transformar y manipular los 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 de la canalización tienen un límite de memoria de 100 megabytes por defecto. Puedes superar este límite pasando un valor de
trueal métodoallowDiskUse()y encadenando el método aaggregate().El operador $graphLookup tiene un límite de memoria estricto de 100 megabytes e ignora el valor pasado al
allowDiskUse()método.
Ejecutar operaciones de agregación
Nota
Datos de muestra
Los ejemplos de esta guía utilizan la restaurants colección sample_restaurants de la base de datos de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte la guía "Comenzar con Atlas".
Para realizar una agregación, pase una lista con las etapas del pipeline al método aggregate(). El controlador de Scala proporciona la clase Aggregates, que incluye métodos auxiliares para crear etapas del pipeline.
Para obtener más información sobre las etapas de la canalización y sus métodos auxiliares Aggregates correspondientes, consulte 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 genera un recuento del número de panaderías en cada distrito de Nueva York. Para ello, llama al método aggregate() y pasa una canalización de agregación como una lista de etapas. El código construye estas etapas mediante los siguientes métodos auxiliares Aggregates:
filter(): Construye la etapa $match para filtrar los documentos que tienen uncuisinevalor de"Bakery"group(): Construye la etapa $group para agrupar los documentos coincidentes por elboroughcampo, 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}
Explicar una agregación
Para ver información sobre cómo MongoDB ejecuta su operación, puede indicarle al planificador de consultas de MongoDB que la explique. Cuando MongoDB explica una operación, devuelve planes de ejecución y estadísticas de rendimiento. Un plan de ejecución es una forma en que MongoDB puede completar una operación. Al indicarle a MongoDB que explique una operación, devuelve tanto el plan ejecutado como cualquier plan de ejecución rechazado por defecto.
Para explicar una operación de agregación, encadene el explain() método al aggregate() método. Puede pasar un nivel de verbosidad a,explain() lo que modifica el tipo y la cantidad de información que devuelve el método. Para más información sobre el nivel de verbosidad, consulte "Modos de verbosidad" en el manual de MongoDB Server.
El siguiente ejemplo indica a MongoDB que explique la operación de agregación del ejemplo anterior de Filtrar, Agrupar y Contar Documentos. El código pasa un valor de verbosidad de ExplainVerbosity.EXECUTION_STATS al explain() método, que lo configura 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 canalización de agregación solo está disponible para colecciones con un índice de búsqueda MongoDB.
Para especificar una búsqueda de texto completo de uno o más campos, puede crear 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: especifica el campo y el texto a buscar.SearchOptionsInstancia: Especifica opciones para personalizar la búsqueda de texto completo. Debe configurar la opciónindexcon el nombre del índice de búsqueda de MongoDB que se utilizará.
Este ejemplo crea etapas de canalización para realizar las siguientes acciones:
Busque en el campo
nametexto que contenga la palabra"Salt"Proyectar únicamente los valores
_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 búsqueda de MongoDB en la colección restaurants que cubra el campo name. Luego, reemplace el marcador de posición "<search index name>" con el nombre del índice. Para obtener más información sobre los índices de búsqueda de MongoDB, consulte Guía de índices de búsqueda de MongoDB.
Métodos auxiliares del operador de búsqueda
El controlador Scala proporciona métodos auxiliares para los siguientes operadores:
Operador | Descripción |
|---|---|
Realiza una búsqueda de una palabra o frase que contenga una secuencia de caracteres de una cadena de entrada incompleta. | |
Combina dos o más operadores en una sola consulta. | |
Comprueba si un campo coincide con el valor especificado. Se asigna a los métodos | |
Comprueba si existe una ruta a un nombre de campo indexado específico en un documento. | |
Realiza una búsqueda de una matriz de valores BSON de número, fecha, booleano, objectId, uuid o cadena en la ruta indicada y devuelve documentos donde el valor del campo es igual a cualquier valor en la matriz especificada. | |
Devuelve documentos similares a los documentos de entrada. | |
Admite la consulta y puntuación de valores numéricos, de fecha y 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. | |
Admite la consulta y puntuación de valores numéricos, de fecha y de cadena. Se asigna a los métodos | |
Interpreta el campo de consulta como una expresión regular. | |
Realiza una búsqueda de texto completo utilizando el analizador que especifique en la configuración del índice. | |
Permite consultas que utilizan caracteres especiales en la cadena de búsqueda que pueden coincidir con cualquier carácter. |
Ejemplo de etapa de búsqueda en el pipeline
Nota
Conjunto de datos de muestra del Atlas
Este ejemplo utiliza la colección sample_mflix.movies de los conjuntos de datos de muestra de Atlas. Para aprender cómo configurar un clúster de Atlas de nivel gratuito y cargar el conjunto de datos de muestra, consulta el tutorial Empezar con Atlas en la documentación de Atlas.
Antes de poder ejecutar este ejemplo, debe 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 la creación de índices de búsqueda de MongoDB, consulte la guía Índices de búsqueda de MongoDB.
El siguiente código crea una etapa $search que tiene las siguientes especificaciones:
Comprueba que la matriz
genresincluye"Comedy"Busca en el campo
fullplotla frase"new york"Coincide con
yearvalores entre1950y2000, inclusiveBusca
titlevalores que 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 auxiliares de búsqueda de MongoDB, consulte la referencia de la interfaz SearchOperator en la documentación de la API de Driver Core.
Información Adicional
Manual del servidor MongoDB
Para obtener más información sobre los temas tratados en esta guía, consulte las siguientes páginas del manual de MongoDB Server:
Para obtener una lista completa de las etapas de agregación, consulta Etapas de agregación en el manual de MongoDB Server.
Para obtener más información sobre cómo ensamblar una canalización de agregación y ver ejemplos, consulte Canalización de agregación.
Para obtener más información sobre cómo crear etapas de canalización, consulte Etapas de agregación.
Para obtener más información sobre cómo explicar las operaciones de MongoDB, consulte Explicar los planesde salida y consulta.
Documentación de la API
Para obtener más información sobre los métodos y tipos analizados en esta guía, consulte la siguiente documentación de API: