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

Transforma tus datos con agregación

En esta guía puedes aprender a utilizar el driver Ruby 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 Ruby en el menú desplegable Select your language en la esquina superior derecha de la página.

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

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

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 true al método allow_disk_use y encadenar el método con aggregate.

  • La $graphLookup operadora tiene un límite estricto de memoria de 100 megabytes y omite el valor pasado al método allow_disk_use.

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 muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los datasets de muestra, consulta la guía Primeros Pasos con Atlas.

Para realizar una agregación, define cada etapa de la pipeline como un hash de Ruby y luego pasa el pipeline de operaciones al método aggregate.

El siguiente ejemplo de código genera un recuento del número de panaderías en cada distrito de Nueva York. Para ello, utiliza una canalización de agregación con las siguientes etapas:

  • Una etapa $match para filtrar documentos cuyo campo cuisine contenga el valor "Bakery".

  • Una etapa $group para agrupar los documentos coincidentes por el borough campo, acumulando un recuento de documentos para cada valor distinto.

database = client.use('sample_restaurants')
restaurants_collection = database[:restaurants]
pipeline = [
{ '$match' => { 'cuisine' => 'Bakery' } },
{ '$group' => {
'_id' => '$borough',
'count' => { '$sum' => 1 }
}
}
]
aggregation = restaurants_collection.aggregate(pipeline)
aggregation.each do |doc|
puts doc
end
{"_id"=>"Bronx", "count"=>71}
{"_id"=>"Manhattan", "count"=>221}
{"_id"=>"Queens", "count"=>204}
{"_id"=>"Missing", "count"=>2}
{"_id"=>"Staten Island", "count"=>20}
{"_id"=>"Brooklyn", "count"=>173}

Para ver información sobre cómo MongoDB ejecuta tu operación, puedes instruir al planificador de query de MongoDB para que lo explique. Cuando MongoDB explica una operación, devuelve planes de ejecución y estadísticas de rendimiento. Un plan de ejecución es una posible manera en la que MongoDB puede completar una operación. Cuando indicas a MongoDB que explique una operación, por defecto devuelve tanto el plan ejecutado por MongoDB como cualquier plan de ejecución rechazado.

Para explicar una operación de agregación, conecta el método explain al método aggregate.

El siguiente ejemplo indica a MongoDB que explique la operación de agregación del Ejemplo de agregación:anterior

explanation = restaurants_collection.aggregate(pipeline).explain()
puts explanation
{"explainVersion"=>"2", "queryPlanner"=>{"namespace"=>"sample_restaurants.restaurants",
"parsedQuery"=>{"cuisine"=> {"$eq"=> "Bakery"}}, "indexFilterSet"=>false,
"planCacheKey"=>"6104204B", "optimizedPipeline"=>true, "maxIndexedOrSolutionsReached"=>false,
"maxIndexedAndSolutionsReached"=>false, "maxScansToExplodeReached"=>false,
"prunedSimilarIndexes"=>false, "winningPlan"=>{"isCached"=>false,
"queryPlan"=>{"stage"=>"GROUP", "planNodeId"=>3,
"inputStage"=>{"stage"=>"COLLSCAN", "planNodeId"=>1, "filter"=>{},
"direction"=>"forward"}},...}

Nota

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 de uno o más campos, puedes usar MongoDB Search para crear una etapa de pipeline $search.

Este ejemplo crea etapas de pipeline para realizar las siguientes acciones:

  • Busca el término "Salt"en el campo name

  • Proyectar únicamente los valores _id y name de los documentos coincidentes

Importante

Para ejecutar el siguiente ejemplo, debe crear un índice de búsqueda en MongoDB Search en la colección restaurants que cubra el campo name. Luego, sustituya el marcador de posición "<your_search_index_name>" por el nombre del índice. Para aprender a crear un índice de búsqueda en MongoDB, consulta el Guía de MongoDB Search y MongoDB Vector Search índices.

search_pipeline = [
{
'$search' => {
'index' => '<your_search_index_name>',
'text' => {
'query' => 'Salt',
'path' => 'name'
},
}
},
{
'$project' => {
'_id' => 1,
'name' => 1
}
}
]
results = collection.aggregate(search_pipeline)
results.each do |document|
puts document
end
{"_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"}

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

Para obtener más información sobre los métodos de agregación del controlador Ruby, consulte la documentación de la API para agregación.

Volver

intercalación

En esta página