MongoDB - Agregación

Las operaciones de agregaciones procesan registros de datos y devuelven resultados calculados. Las operaciones de agregación agrupan valores de varios documentos y pueden realizar una variedad de operaciones en los datos agrupados para devolver un solo resultado. En SQL count (*) y con group by es un equivalente de la agregación MongoDB.

El método aggregate ()

Para la agregación en MongoDB, debe usar aggregate() método.

Sintaxis

Sintaxis básica de aggregate() El método es el 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: ['mongodb', 'database', 'NoSQL'],
   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: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

Ahora, de la colección anterior, si desea mostrar una lista que indique cuántos tutoriales ha escrito cada usuario, utilizará lo siguiente aggregate() método -

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>

La consulta equivalente de SQL para el caso de uso anterior será select by_user, count(*) from mycol group by by_user.

En el ejemplo anterior, hemos agrupado los documentos por campo. by_usery en cada aparición del usuario se incrementa el valor anterior de la suma. A continuación se muestra una lista de expresiones de agregación disponibles.

Expresión Descripción Ejemplo
$ suma Suma el valor definido de todos los documentos de la colección. db.mycol.aggregate ([{$ grupo: {_id: "$ por_usuario", num_tutorial: {$ suma: "$ me gusta"}}}])
$ promedio Calcula el promedio de todos los valores dados de todos los documentos de la colección. db.mycol.aggregate ([{$ grupo: {_id: "$ by_user", num_tutorial: {$ avg: "$ likes"}}}])
$ min Obtiene el mínimo de los valores correspondientes de todos los documentos de la colección. db.mycol.aggregate ([{$ grupo: {_id: "$ por_usuario", num_tutorial: {$ min: "$ me gusta"}}}])
$ máximo Obtiene el máximo de los valores correspondientes de todos los documentos de la colección. db.mycol.aggregate ([{$ grupo: {_id: "$ por_usuario", num_tutorial: {$ max: "$ me gusta"}}}])
$ empujar Inserta el valor en una matriz en el documento resultante. db.mycol.aggregate ([{$ grupo: {_id: "$ por_usuario", url: {$ push: "$ url"}}}])
$ addToSet Inserta el valor en una matriz en el documento resultante, pero no crea duplicados. db.mycol.aggregate ([{$ grupo: {_id: "$ por_usuario", url: {$ addToSet: "$ url"}}}])
$ primero Obtiene el primer documento de los documentos de origen según la agrupación. Por lo general, esto solo tiene sentido junto con alguna etapa "$ sort" aplicada previamente. db.mycol.aggregate ([{$ grupo: {_id: "$ por_usuario", primera_url: {$ primero: "$ url"}}}])
$ último Obtiene el último documento de los documentos de origen según la agrupación. Por lo general, esto solo tiene sentido junto con alguna etapa "$ sort" aplicada previamente. db.mycol.aggregate ([{$ grupo: {_id: "$ by_user", last_url: {$ last: "$ url"}}}])

Concepto de tubería

En el comando UNIX, la canalización de shell significa la posibilidad de ejecutar una operación en alguna entrada y usar la salida como entrada para el siguiente comando y así sucesivamente. MongoDB también admite el mismo concepto en el marco de agregación. Existe un conjunto de etapas posibles y cada una de ellas se toma como un conjunto de documentos como entrada y produce un conjunto resultante de documentos (o el documento JSON resultante final al final de la canalización). Esto, a su vez, se puede utilizar para la siguiente etapa y así sucesivamente.

Las siguientes son las posibles etapas en el marco de 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, 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 determinada de documentos.

  • $limit - Esto limita la cantidad de documentos a mirar, por el número dado a partir de las posiciones actuales.

  • $unwind- Se utiliza para desenrollar documentos que utilizan matrices. Cuando se usa una matriz, los datos se unen previamente y esta operación se deshará con esto para tener documentos individuales nuevamente. Así, con esta etapa aumentaremos la cantidad de documentos para la siguiente etapa.