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

Operaciones de agregación

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.

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

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:

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.

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

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

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

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.

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.

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:

Volver

Atributos anidados

En esta página