Hoy os voy a hablar de Aggregation Framework, un método para manipular datos de forma sencilla que podemos encontrar a partir de la versión 2.2 de MongoDB. Para los que estamos acostumbrados a usar SQL, veremos que este metodo es muy similar en el concepto de realizar simples querys en SQL. Al igual que un shell script en linux, usaremos operadores de pipelines(tuberías), de esta forma conseguimos redirigir la salida de un proceso a otro y así afinar los resultados de nuestra query.
Lo operadores de pipelines(tuberías) que podemos usar en Aggregation Framework son:
- $project -> Usado para añadir, renombrar, eliminar o realizar operaciones sobre campos de un documento.
- $match -> Este operador podemos realizar condiciones para afinar nuestra busqueda sobre documentos (En sql seria el equivalente a WHERE).
- $limit -> Al igual que en SQL, con limit podemos delimitar el numero de documentos obtenidos.
- $skip -> Con skip podremos saltarnos el numero de documentos que indiquemos.
- $unwind -> Devuelve los elementos de un array como una secuencia de documentos, es decir, un documento por cada miembro del array.
- $group -> Se usa para agrupar documentos con el propósito de calcular valores agregados basados en una colección es el equivalente al Group by en SQL.
- $sort -> Con sort podemos ordenador nuestra query por el campo indicado.
La forma de usar los operadores es la siguiente:
 db.mycoleccion.aggregate({ operadores de pipelines })
Veamos algunos ejemplos, teniendo en cuenta la siguiente colección creada para este articulo:
- Ejemplo Nº1 como obtener todos los documentos escritos por drsromero cuya calificación haya sido mayor de 4.

db.ejemplo.aggregate ( [
{$match:
   {autor: "drsromero" , calificacion: { $gt : 3 }}}
 ])
- Ejemplo Nº2 todos los documentos ordenador por autor de forma ascendente y calificación de forma descendente.
db.ejemplo.aggregate ( [ 
   {$sort: { autor: 1, articulo: -1 }}
 ])
- Ejemplo Nº3, queremos mostrar cuantos artículos ha escrito cada autor (para este ejemplo se inserto un documento mas en la colección ejemplo).
db.ejemplo.aggregate([
  { $group: {
    _id: "$autor",
    numero_articulos: { $sum: 1 }
  } },
  { $project: {
    _id: 0,
    autor: "$_id",
    numero_articulos: 1
  } }
]);
- Ejemplo Nº4, vamos a sacar la máxima calificación obtenida por autor.
db.ejemplo.aggregate([
  {$group:{
    _id: "$autor" , 
    maxima_calificacion:{$max:"$calificacion" }
  }},
  { $project: {
    _id: 0,
    autor: "$_id",   
    maxima_calificacion: 1
  } }
]);
- Ejemplo Nº5 Como sacar cuantos Artículos han escrito cada autor con la máxima calificación.
db.ejemplo.aggregate([
    { $group : { _id : { autor : "$autor",
                         calificacion : "$calificacion" },
                 articulos : { $sum : 1 },
    }},
    { $sort : { "_id.calificacion" : -1 }},
    { $group : { _id : "$_id.autor",
                 calificacion : { $first : "$_id.calificacion" },
                 articulos : { $first : "$articulos" },
    }},
    {$project : { _id: 0,
     autor: "$_id",
                  maxima_calificacion:"$calificacion",
    Numero_articulos:"$articulos"},
  }
])
 





 
No hay comentarios:
Publicar un comentario