Overview
En esta guía, puedes aprender cómo usar Mongoid 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.
Las operaciones de agregación funcionan de manera similar a las fábricas de automóviles con líneas de ensamblaje. Las líneas de ensamblaje cuentan con estaciones dotadas de herramientas especializadas para llevar a cabo tareas específicas. Por ejemplo, al fabricar un automóvil, la línea de ensamblaje comienza con el chasis. Luego, a medida que el bastidor del auto avanza por la línea de montaje, cada estación ensambla una pieza diferente. El resultado es un producto final transformado, el auto terminado.
La línea de montaje representa el pipeline de agregación, las estaciones individuales representan las etapas de agregación, las herramientas especializadas representan los operadores de expresión y el producto final representa el resultado agregado.
Comparar las operaciones de agregación y búsqueda
La siguiente tabla enumera las diferentes tareas que se pueden realizar con las operaciones de búsqueda, en comparación con las que se pueden lograr con las operaciones 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 |
Constructores de Mongoid
Puedes crear una pipeline de agregación usando el lenguaje específico de dominio de alto nivel (DSL) de Mongoid. El DSL admite los siguientes operadores de la canalización de agregación:
Para crear una canalización de agregación mediante uno de los operadores anteriores, llame al método correspondiente en una instancia de Criteria. Al llamar al método, la operación de agregación se añade al atributo pipeline de la instancia Criteria. Para ejecutar la canalización de agregación, pase el valor del atributo pipeline al método Collection#aggregate.
Ejemplo
Considera una base de datos que contiene una colección con documentos modelados por las siguientes clases:
class Tour include Mongoid::Document embeds_many :participants field :name, type: String field :states, type: Array end class Participant include Mongoid::Document embedded_in :tour field :name, type: String end
En este ejemplo, el modelo Tour representa el nombre de un tour y los estados por los que pasa, y el modelo Participant representa el nombre de una persona que participa en el tour.
El siguiente ejemplo crea una pipeline de agregación que muestra los estados que un participante ha visitado usando las siguientes operaciones de agregación:
matchque encuentra documentos en los que el valor del campoparticipants.namees"Serenity"unwind, que deconstruye el campo de matrizstatesy genera un documento para cada elemento de la matrizgroupque agrupa los documentos por el valor de su campostatesproject, que solicita al pipeline que devuelva solo los campos_idystates
criteria = Tour.where('participant.name' => 'Serenity'). unwind(:states). group(_id: 'states', :states.add_to_set => '$states'). project(_id: 0, states: 1) @states = Tour.collection.aggregate(criteria.pipeline).to_json
[{"states":["OR","WA","CA"]}]
Agregación sin desarrolladores
Puedes usar el método Collection#aggregate para ejecutar operaciones de agregación que no tengan métodos de creación correspondientes, pasando un arreglo de operaciones de agregación. El uso de este método para realizar la agregación devuelve objetos BSON::Document sin procesar en lugar de instancias del modelo Mongoid::Document.
Ejemplo
Considera una base de datos que contiene una colección con documentos modelados por las siguientes clases:
class Band include Mongoid::Document has_many :tours has_many :awards field :name, type: String end class Tour include Mongoid::Document belongs_to :band field :year, type: Integer end class Award include Mongoid::Document belongs_to :band field :name, type: String end
El siguiente ejemplo crea una pipeline de agregación para recuperar todas las bandas que han estado de gira desde 2000 y que han recibido al menos 1 premio:
band_ids = Band.collection.aggregate([ { '$lookup' => { from: 'tours', localField: '_id', foreignField: 'band_id', as: 'tours', } }, { '$lookup' => { from: 'awards', localField: '_id', foreignField: 'band_id', as: 'awards', } }, { '$match' => { 'tours.year' => {'$gte' => 2000}, 'awards._id' => {'$exists' => true}, } }, {'$project' => {_id: 1}}, ]) bands = Band.find(band_ids.to_a)
[ {"_id": "...", "name": "Deftones" }, {"_id": "...", "name": "Tool"}, ... ]
Tip
El ejemplo anterior proyecta únicamente el campo _id de los documentos de salida. Luego, usa los resultados proyectados para encontrar los documentos y devolverlos como Mongoid::Document instancias de modelos. Este paso opcional no es necesario para ejecutar una pipeline de agregación.
Información Adicional
Para ver una lista completa de operadores de agregación, consulta Operadores de agregación.
Para aprender sobre la creación de un pipeline de agregación y ver ejemplos, consulta Pipeline de agregación.
Documentación de la API
Para obtener más información sobre cualquiera de los métodos mencionados en esta guía, consulta la siguiente documentación de la API: