Docs Menu
Docs Home
/ /

Transforma tus datos con agregación

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.

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

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:

Operador
Nombre del método

$group

group

project

unwind

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.

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 campo participants.name es "Serenity"

  • unwind, que deconstruye el campo de matriz states y genera un documento para cada elemento de la matriz

  • group, que agrupa los documentos por el valor de su campo states

  • project, que solicita al pipeline que devuelva solo los campos _id y states

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"]}]

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.

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.

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.

Para obtener más información sobre cualquiera de los métodos analizados en esta guía, consulte la siguiente documentación de API:

Volver

Modificar resultados de la consulta

En esta página