Overview
En esta guía, puede aprender a utilizar Mongoid 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.
Las operaciones de agregación funcionan de forma similar a las fábricas de automóviles con líneas de montaje. Estas líneas cuentan con estaciones con herramientas especializadas para realizar tareas específicas. Por ejemplo, al fabricar un automóvil, la línea de montaje comienza con el chasis. A medida que este avanza por la línea, cada estación ensambla una pieza independiente. El resultado es un producto final transformado: el automóvil terminado.
La línea de ensamblaje representa la cadena de agregación, las estaciones individuales representan las etapas de agregación, las herramientas especializadas representan los operadores de expresión y el producto terminado 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
Puede construir una canalización de agregación utilizando el lenguaje específico de dominio (DSL) de alto nivel de Mongoid. El DSL admite los siguientes operadores de 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
Considere 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 canalización de agregación que genera los estados que ha visitado un participante mediante las siguientes operaciones de agregación:
match, que encuentran 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 matrizgroup, que 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 constructores
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
Considere 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 canalización de agregación para recuperar todas las bandas que han estado de gira desde 2000 y tienen 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, utiliza los resultados proyectados para encontrar los documentos y devolverlos como instancias del modelo Mongoid::Document. Este paso opcional no es necesario para ejecutar una canalización de agregación.
Información Adicional
Para ver una lista completa de operadores de agregación, consulta Operadores de agregación.
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.
Documentación de la API
Para obtener más información sobre cualquiera de los métodos analizados en esta guía, consulte la siguiente documentación de API: