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 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 Ruby desde el menú desplegable Select your language en la esquina superior derecha de la página.

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.

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

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

  • El operador $graphLookup tiene un límite de memoria estricto de 100 megabytes e ignora el valor pasado al allow_disk_use método.

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, defina cada etapa de la canalización como un Ruby hash y luego pase la canalización 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 cuisine campo contiene el "Bakery" valor.

  • 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 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 método explain al método aggregate.

El siguiente ejemplo le 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 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 utilizar MongoDB Search para crear una etapa de canalización $search.

Este ejemplo crea etapas de canalización para realizar las siguientes acciones:

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

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

Importante

Para ejecutar el siguiente ejemplo, 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 "<your_search_index_name>" con el nombre del índice. Para aprender a crear un índice de búsqueda de MongoDB, consulte Guíade índices de búsqueda de MongoDB y búsqueda vectorial de MongoDB.

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

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

Intercalaciones

En esta página