Las operaciones de agregación procesan registros de datos y devuelven resultados calculados. Las operaciones de agregación agrupan valores de varios documentos y pueden realizar diversas operaciones con los datos agrupados para devolver un único resultado. En SQL count(*) y con group by es un equivalente de la agregación en MongoDB.
El método aggregate()
Para la agregación en MongoDB, se debe utilizar el método aggregate().
Sintaxis
La sintaxis básica del método aggregate() es la siguiente –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Ejemplo
En la colección tienes los siguientes datos –
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 100},{ _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 10},{ _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: , likes: 750},
Ahora desde la colección anterior, si quieres mostrar una lista que indique cuántos tutoriales ha escrito cada usuario, entonces utilizarás el siguiente método aggregate() –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
La consulta equivalente en SQL para el caso de uso anterior será select by_user, count(*) from mycol group by_user.
En el ejemplo anterior, hemos agrupado los documentos por el campo by_user y en cada ocurrencia de by user se incrementa el valor anterior de la suma. A continuación se muestran las expresiones de agregación disponibles.
Expresión | Descripción | Ejemplo |
---|---|---|
$sum | Suma el valor definido de todos los documentos de la colección. | db.mycol.aggregate() |
$avg | Calcula la media de todos los valores dados de todos los documentos de la colección. | db.mycol.aggregate() |
$min | Obtiene el mínimo de los valores correspondientes de todos los documentos de la colección. | db.mycol.aggregate() |
$max | Obtiene el máximo de los valores correspondientes de todos los documentos de la colección. | db.mycol.aggregate() |
$push | Inserta el valor a un array en el documento resultante. | db.mycol.aggregate() |
$addToSet | Inserta el valor en un array en el documento resultante pero no crea duplicados. | db.mycol.aggregate() |
$first | Obtiene el primer documento de los documentos fuente según la agrupación. Normalmente esto sólo tiene sentido junto con alguna etapa «$sort» aplicada previamente. | db.mycol.aggregate() |
$last | Obtiene el último documento de los documentos fuente según la agrupación. Típicamente, esto sólo tiene sentido junto con alguna etapa «$sort» aplicada previamente. | db.mycol.aggregate() |
Concepto de pipeline
En el comando UNIX, shell pipeline significa la posibilidad de ejecutar una operación en alguna entrada y utilizar la salida como entrada para el siguiente comando y así sucesivamente. MongoDB también soporta el mismo concepto en el marco de agregación. Hay un conjunto de posibles etapas y cada una de ellas se toma como un conjunto de documentos como entrada y produce un conjunto de documentos resultante (o el documento JSON final resultante al final del pipeline). Esto a su vez puede ser utilizado para la siguiente etapa y así sucesivamente.
Las siguientes son las posibles etapas en el marco de la agregación –
-
$project – Se utiliza para seleccionar algunos campos específicos de una colección.
-
$match – Esta es una operación de filtrado y por lo tanto esto puede reducir la cantidad de documentos que se dan como entrada a la siguiente etapa.
-
$group – Esto hace la agregación real como se discutió anteriormente.
-
$sort – Ordena los documentos.
-
$skip – Con esto, es posible saltar hacia adelante en la lista de documentos para una cantidad dada de documentos.
-
$limit – Esto limita la cantidad de documentos a mirar, por el número dado a partir de las posiciones actuales.
-
$unwind – Esto se utiliza para desenrollar el documento que están utilizando matrices. Cuando se usa un array, los datos están como pre-unidos y esta operación se deshará con esto para volver a tener documentos individuales. Así con esta etapa aumentaremos la cantidad de documentos para la siguiente etapa.