f?:@'.$&2& %g&1'210*%a'*5% h&$02'$$%!5&102$%!,ij · creador...

13
Avenida de Castilla,1 - Edificio Best Point - Oficina 21B 28830 San Fernando de Henares (Madrid) tel./fax: +34 91 675 33 06 [email protected] - www.autentia.com Somos su empresa de Soporte a Desarrollo Informático. Ese apoyo que siempre quiso tener... 1. Desarrollo de componentes y proyectos a medida Tecnología Desarrollo Sistemas Gran Empresa Producción autentia Certificación o Pruebas Verificación previa RFP Concurso Consultora 1 Consultora 2 Consultora 3 Equipo propio desarrollo Piloto 3a 3b 1. Definición de frameworks corporativos. 2. Transferencia de conocimiento de nuevas arquitecturas. 3. Soporte al arranque de proyectos. 4. Auditoría preventiva periódica de calidad. 5. Revisión previa a la certificación de proyectos. 6. Extensión de capacidad de equipos de calidad. 7. Identificación de problemas en producción. 3. Arranque de proyectos basados en nuevas tecnologías ¿Qué ofrece Autentia Real Business Solutions S.L? Para más información visítenos en: www.autentia.com Compartimos nuestro conociemiento en: www.adictosaltrabajo.com Gestor portales (Liferay) Gestor de contenidos (Alfresco) Aplicaciones híbridas Tareas programadas (Quartz) Gestor documental (Alfresco) Inversión de control (Spring) BPM (jBPM o Bonita) Generación de informes (JasperReport) ESB (Open ESB) Control de autenticación y acceso (Spring Security) UDDI Web Services Rest Services Social SSO SSO (Cas) Spring MVC, JSF-PrimeFaces /RichFaces, HTML5, CSS3, JavaScript-jQuery JPA-Hibernate, MyBatis Motor de búsqueda empresarial (Solr) ETL (Talend) Dirección de Proyectos Informáticos. Metodologías ágiles Patrones de diseño TDD 2. Auditoría de código y recomendaciones de mejora 4. Cursos de formación (impartidos por desarrolladores en activo)

Upload: trankhue

Post on 29-Sep-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

Avenida de Castilla,1 - Edificio Best Point - Oficina 21B28830 San Fernando de Henares (Madrid)

tel./fax: +34 91 675 33 [email protected] - www.autentia.com

Somos su empresa de Soporte a Desarrollo Informático.Ese apoyo que siempre quiso tener...

1. Desarrollo de componentes y proyectos a medida

TecnologíaDesarrolloSistemas

Gran Empresa

Producción

autentia

Certificacióno Pruebas

Verificación previa

RFP Concurso

Consultora 1

Consultora 2

Consultora 3

Equipo propio desarrolloPiloto

3a

3b

1. Definición de frameworks corporativos.2. Transferencia de conocimiento de nuevas arquitecturas.3. Soporte al arranque de proyectos.4. Auditoría preventiva periódica de calidad.5. Revisión previa a la certificación de proyectos.6. Extensión de capacidad de equipos de calidad.7. Identificación de problemas en producción.

3. Arranque de proyectos basados en nuevas tecnologías

¿Qué ofrece Autentia Real Business Solutions S.L?

Para más información visítenos en: www.autentia.com

Compartimos nuestro conociemiento en: www.adictosaltrabajo.com

Gestor portales (Liferay)Gestor de contenidos (Alfresco)Aplicaciones híbridas

Tareas programadas (Quartz)Gestor documental (Alfresco)Inversión de control (Spring)

BPM (jBPM o Bonita)Generación de informes (JasperReport)ESB (Open ESB)

Control de autenticación y acceso (Spring Security)UDDIWeb ServicesRest ServicesSocial SSOSSO (Cas)

Spring MVC, JSF-PrimeFaces /RichFaces, HTML5, CSS3, JavaScript-jQuery

JPA-Hibernate, MyBatisMotor de búsqueda empresarial (Solr)ETL (Talend)

Dirección de Proyectos Informáticos.Metodologías ágilesPatrones de diseñoTDD

2. Auditoría de código y recomendaciones de mejora

4. Cursos de formación (impartidos por desarrolladores en activo)

Page 2: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 1/12

Entra en Adictos a través de

Entrar

E-­mail

Contraseña

Deseo registrarmeOlvidé mi contraseña

Inicio Quiénes somos Formación Comparador de salarios Nuestros libros Más

» Estás en: Inicio Tutoriales Manipulación de datos en MongoDB mediante Aggregation Pipeline.

Síguenos a través de:

Catálogo de servicios

Autentia

Últimas Noticias

» IX Autentia Cycling Day(ACTUALIZADO)

» Spring 4.0 ¿qué hay denuevo amigo?

» Torneo de pádel solidarioAMEB

» Próxima charla: Gradlecomo alternativa a Mavenpara la construcción deproyectos en Java

» Conferencias Big DataSpain

Histórico de noticias

Últimos Tutoriales

» Hello World en IOS sinStoryBoard

» Cómo integrar un Job deTalend a nuestro proyectoJava

» Agrupación de datos conMongoDB: uso de Group.

» Primeros pasos conApache Cassandra

» Cómo instalar Gradle,herramienta de

Ver todos los tutoriales del autor

Roberto Canales Mora

Creador y propietario de AdictosAlTrabajo.com, Director General de AutentiaS.L., Ingeniero Técnico de Telecomunicaciones y Executive MBA por elInstituto de Empresa 2007.

Twitter: Follow @rcanalesmora

Autor de los Libros: Planifica tu éxito: de aprendiz a empresario y Informáticaprofesional, las reglas no escritas para triunfar en la empresa

Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aquí

Fecha de publicación del tutorial: 2013-­12-­16 Tutorial visitado 1 veces Descargar en PDF

Manipulación de datos en MongoDB mediante Aggregation

Pipeline.

0. Índice de contenidos.

1. Entorno.2. Introducción.3. Secuencia 1: Buscando solamente los documentos necesarios.4. Secuencia 2: Elevando los gastos a primer nivel.5. Secuencia 3: Elevando las compras a primer nivel.6. Secuencia 4: Filtrando los campos y colocándolos para manipularlos con facilidad.7. Secuencia Final : Agrupamiento.8. Mejorando la secuencia.9. Dudas sobre otras optimizaciones.10. Almacenamiento de los datos de una agregación en otra colección.11. Conclusiones.

1. Entorno

Este tutorial está escrito usando el siguiente entorno:

Hardware: Ordenador iMac 27" (3.2 GHz Intel Core i5, 8 GB DDR3)Sistema Operativo: Mac OS X Mavericks 10.9

2. Introducción.

Este es es tercer tutorial de una serie que estoy haciendo sobre MongoDB. Podéis ir a estos enlaces como punto departida: el primero, o el segundo.

En este caso vamos a ver cómo procesar estructuras complejas de datos para conseguir subtotales por distintos criterioscon estructuras complejas e incluso cómo almacenar estos datos en otras estructuras/colecciones.

Os recomiendo descargar la documentación de Aggregation del site de mongoDB en formato pdf:http://docs.mongodb.org/manual/aggregation/

Page 3: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 2/12

automatización de builds

Últimos Tutoriales del

Autor

» Agrupación de datos conMongoDB: uso de Group.

» Primeros pasos conApache Cassandra

» Primeros pasos conMongoDB

» Comentando User StoriesApplied for Agile SoftwareDevelopment de Mike Cohn

» Comentando el libro TheLeader´s Guide to RadicalManagement de StephenDenning

Últimas ofertas de

empleo

2011-­09-­08Comercial -­ Ventas -­MADRID.

2011-­09-­03Comercial -­ Ventas -­VALENCIA.

2011-­08-­19Comercial -­ Compras -­ALICANTE.

2011-­07-­12Otras Sin catalogar -­MADRID.

2011-­07-­06Otras Sin catalogar -­LUGO.

Con Aggregation Pipeline, a través de la concatenación de comandos, vamos obteniendo conjuntos de documentosintermedios que podemos transformar.

El juego de datos de partida que manejaremos será el siguiente, el mismo que en el anterior tutorial:

/* 0 */

"_id" : ObjectId("529f4fcc21c58ff03c428c6e"),

"nombre" : "Roberto",

"apellido" : "Canales",

"peso" : 80,

"sede" : "Madrid",

"puesto" : "Desarrollo",

"gastos" : [

"fecha" : "Enero",

"Comercio" : "ElCorteDeManga",

"Compra" : [

"Concepto" : "Electronica",

"Importe" : 1000

,

"Concepto" : "Alimentación",

"Importe" : 2000

,

"Concepto" : "Deportes",

"Importe" : 2000

]

,

"fecha" : "Febrero",

"Comercio" : "Garranfur",

"Compra" : [

"Concepto" : "Electronica",

"Importe" : 400

,

"Concepto" : "Alimentación",

"Importe" : 1000

,

"Concepto" : "Deportes",

"Importe" : 2000

]

]

Page 4: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 3/12

/* 1 */

"_id" : ObjectId("529f503121c58ff03c428c6f"),

"nombre" : "Jose Maria",

"apellido" : "Toribio",

"peso" : 78,

"sede" : "Madrid",

"puesto" : "Operaciones",

"gastos" : [

"fecha" : "Enero",

"Comercio" : "EFVNAF",

"Compra" : [

"Concepto" : "Electronica",

"Importe" : 1000

,

"Concepto" : "Deportes",

"Importe" : 2000

]

,

"fecha" : "Febrero",

"Comercio" : "Garranfur",

"Compra" : [

"Concepto" : "Electronica",

"Importe" : 400

,

"Concepto" : "Alimentación",

"Importe" : 1000

]

]

Para que quede más claro lo vemos visualmente con Robomongo. Tenemos una ficha de una persona con sus atributos.La persona tiene una array de gastos. Cada gasto sus atributos y un array de compras.

Page 5: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 4/12

3. Secuencia 1: Buscando solamente los documentos necesarios.

Para empezar vamos a cambiar un poco el modo de escribir los comandos: la coma la vamos a poner al principioporque, de ese modo, podemos comentar las lineas siguientes e ir viendo cada línea del lote qué es lo que hace.

Lo lógico en una cadena es restringir al máximo el conjunto de documentos que recuperaremos.

match nos permite definir los datos sobre los que filtrar.

Page 6: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 5/12

4. Secuencia 2: Elevando los gastos a primer nivel.

Como podemos observar, los gastos son un array, cosa que complica las operaciones de agrupación. Vamos a usar elcomando $unwind para crear duplicados del documento pero subiendo cada elemento del array a un objeto.

Page 7: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 6/12

5. Secuencia 3: Elevando las compras a primer nivel.

Ahora vamos a repetir operación y vamos a convertir cada elemento del array de Compra a una nueva copia dedocumento.

Acabamos por tanto realizar una labor de "multiplicación" de los documentos.

Page 8: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 7/12

6. Secuencia 4: Filtrando los campos y colocándolos para manipularlos con facilidad.

Podemos ver que los documentos tienen muchos datos y podemos restringir los que nos interesan y simplificar laestructura del documento a procesar.

Page 9: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 8/12

7. Secuencia Final : Agrupamiento.

Con ya los documentos necesarios y con estructura sencilla hacemos la función de agrupamiento.

Creamos una clave compuesta formada por la fecha, comercio y concepto: , $group: _id : fecha : "$fecha" ,comercio : "$comercio", concepto : "$concepto" , importe : $sum : "$importe"

db.roberto.aggregate(

$match: sede : "Madrid"

, $unwind : "$gastos"

, $unwind : "$gastos.Compra"

, $project : centro : "$sede" ,

fecha : "$gastos.fecha",

comercio : "$gastos.Comercio",

concepto : "$gastos.Compra.Concepto",

importe : "$gastos.Compra.Importe"

, $group: _id : fecha : "$fecha" , comercio : "$comercio", concepto : "$concepto" , importe : $sum : "$importe"

)

Page 10: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 9/12

Cambiando simplemente el orden de los campos de la clave podemos obtener las agrupaciones deseadas.

8. Mejorando la secuencia.

Curiosamente, tendremos que plantearnos pronto que la gracia del BigData es usar millones de datos y que, por tanto,hay que ser cuidadoso en cómo se hacen las cosas.

Hay limitaciones en cuando al uso de recursos así que tenemos que ver si lo mismo se puede hacer en menos pasos ocon menos datos.

Podemos pronto ver que la projection no era imprescindible y que podíamos acceder a los campos directamente.

db.roberto.aggregate(

$match: sede : "Madrid"

, $unwind : "$gastos"

, $unwind : "$gastos.Compra"

, $group:

_id : fecha : "$gastos.fecha" , comercio : "$gastos.Comercio", concepto : "$gastos.Compra.Concepto" ,

importe : $sum : "$gastos.Compra.Importe"

)

Page 11: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 10/12

9. Dudas sobre otras optimizaciones.

Otra cosa que nos podríamos plantear es hacer una proyección previa para eliminar todos los datos que no sonnecesarios, del documento original, en el resto de la cadena. Parecería sensato si el documento tiene muchos camposno usados.

db.roberto.aggregate(

$match: sede : "Madrid"

, $project : sede : "$sede" , gastos : "$gastos"

, $unwind : "$gastos"

, $unwind : "$gastos.Compra"

, $group:

_id : fecha : "$gastos.fecha" , comercio : "$gastos.Comercio", concepto : "$gastos.Compra.Concepto" ,

importe : $sum : "$gastos.Compra.Importe"

)

Page 12: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 11/12

10. Almacenamiento de los datos de una agregación en otra colección.

Una de las cosas que seguro que nos interesa hacer es almacenar el resultado de una agregación en una nuevacolección. Esto es trivial:

resultado = db.roberto.aggregate(

$match: sede : "Madrid"

, $project : sede : "$sede" , gastos : "$gastos"

, $unwind : "$gastos"

, $unwind : "$gastos.Compra"

, $group:

_id : fecha : "$gastos.fecha" , comercio : "$gastos.Comercio", concepto : "$gastos.Compra.Concepto" ,

importe : $sum : "$gastos.Compra.Importe"

)

db.datawh.insert(resultado.result);

En sistemas reales deberíamos diferenciar lo que siempre se ha llamado de Rabioso OnLine (ahora near real time) delOnLine. Esto significa que aunque tengamos un flujo de millones de datos de entrada en un sistema por día (near realtime), es posible que para tomar decisiones de negocio lo que nos interese sean las tendencias comparativas con ciclossimilares anteriores (consultas a datos OnLine resumen de históricos recientes). Por tanto, cobra mucho sentido el irprocesando grupos de datos y almacenándolos ya agrupados en colecciones auxiliares.

Incluso parece interesante montar distintos motores de base de datos NoSQL, en cascada, donde cada una de ellasesté especializada en una cosa. Una primera base de datos optimizada en escritura podría valernos para almacenarmillones de registros. Consultando y extrayendo datos de un modo programado (por rangos de horas o días) se podríaalmacenar en otra optimizada en esquemas más complejos o lectura, para facilitar el análisis de datos.

Funcionalidades añadida en otras versiones

Page 13: F?:@'.$&2& %G&1'210*%A'*5% H&$02'$$%!5&102$%!,IJ · Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia ... Puedes consultar mi CV y alguna de mis primeras

12/16/13 Manipulación de datos en MongoDB mediante Aggregation Pipeline.

www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=MongoDBAgregatte 12/12

Esta obra está licenciada bajo licencia Creative Commons de Reconocimiento-­No comercial-­Sin obras derivadas 2.5

PUSH THIS Page Pushers Community Help?

----no clicks + + + + + + + +

0 people brought clicks to this page

powered by karmacracy

» Registrate y accede a esta y otras ventajas «

Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Esta funcionalidad de inserción del resultado en una agregación ya viene en la versión 2.6 de MongoDB añadiendo uncomando out a la agregación, como se hace ya con MapReduce.

11. Conclusiones.

Como podemos observar, cerramos una cereza pero abrimos un melón: tenemos que saber el impacto interno de lo quehacemos porque podríamos saturar el servidor/es por malas decisiones en el procesamiento de datos.

Los siguiente estudios que debería hacer serían de rendimiento con millones de datos para ver si el efecto de lasoptimizaciones son tal cual sospechamos.

Siempre se ha dicho: construye los sistemas para que sean mantenibles y luego optimizarlo. Cuando tenemos millonesde datos en juego, lo mismo tenemos que reformular el dicho ;;-­)

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |

Copyright 2003-­2013 © All Rights Reserved | Texto legal y condiciones de uso | Banners | Powered by Autentia | Contacto