Este artículo es una traducción al español del artículo original de toptal, con quien se ha empezado una colaboración, y en concreto, este tutorial está dedicado a aprender sobre MongoDB, una base de datos NoSQL de la que ya os hablé hace mucho tiempo.
Utilizar datos para resolver preguntas y cuestiones es a lo que los investigadores se dedican cuando sus esfuerzos están dirigidos por los datos. El procesamiento de grandes volúmenes de datos es todo un desafío, y cuanto más datos, mayor es el desafío. Adicionalmente, las investigaciones casi nunca consiguen el tiempo necesario para aprender sobre plataformas de inteligencia de negocio u otras tecnologías como Hadoop eco-system, Spark, o bases de datos NoSQL que ayudar a analizar terabytes de datos en cuestión de minutos.
Tanto investigadores como estadísticos centran sus esfuerzos en crear modelos usando para ellos subconjunto de datos, que son fáciles de trabajar con paquetes analíticos como R, MATLAB, o Octave, para posteriormente implementar las fórmulas en producción por los equipos IT.
Pero este camino tiene un problema, y es que una vez conseguido el modelo, hay que aplicarlo una y otra vez. Pero que pasaría si el investigador pudiera ejecutar el analisis con todos los datos en producción sin necesidad de aprender nuevas tecnologías o complejos lenguajes de programación, o ni tan siquiera con sentencias SQL?
El uso de MongoDB’s Aggregation Pipeline y MEAN de forma efectiva puede incrementar el rendimiento en un breve plazo de tiempo. El código completo de este artículo está disponible en GitHub.
Muchas de las herramientas de Business Intelligence que hay hoy en el mercado ofrecen la posibilidad a los desarrolladores de importar datos de bases de datos NoSQL o de otras tecnologías de Big Data, facilitando el trabajo. En concreto, en la entrada de hoy usaremos todo el poder de MongoDB Aggregation Pipeline sin sacar los datos de MongoDB, de forma que con una simple interfaz pueden hacerse todo tipo de transformaciones sobre datos (big data) en producción.
MongoDB Aggregation Pipeline for Business Intelligence
MongoDB aggregation pipeline es un framework para ejecutar transformaciones de series de datos. Para ello, trabaja con la colección completa de datos como entrada, para trabajar etapa a etapa con los datos obtenidos de la etapa precedente. Ojo, cuando se habla de documentos, es la forma de llamar a los registros en MongoDB!!
Se pueden realizar 10 tipos de transformaciones con este framework:
- $geoNear: crea un subconjunto de documentos por cercanía o lejanía desde un determinado punto
- $match: filtra los datos de entrada atendiendo a expresiones
- $project: crea un subconjunto de datos, incluso con datos calculados
- $redact: restringe los documentos a partir de las informaciones de los documentos
- $unwind: toma una matriz de n elementos de un documento y devuelve n documentos de cada elemento adicionados a cada documento como campo reemplazo de la matriz
- $group: agrupa por una o varias columnas
- $limit: selecciona los primeros n documentos (muy util para cálculo de percentiles, etc.)
- $skip: ignora los primeros n documentos
- $sort: ordena todos los documentos en función de uno o varios campos
- $out: toma todos los documentos obtenidos en una etapa previa y los guarda como una nueva colección
A excepción del primero y último item de la lista anterior, no hay reglas sobre el orden en el que aplicar las transformaciones. $out solo se puee usar una vez, y al final, y solo en caso de que se quiera crear una nueva colección, mientras que $geoNear puede ser solo usado al principio de la cadena de operaciones.
A continuación, nada mejor que ver un ejemplo de uso con datos reales, y el primero es con datos de nces.ed.gov. Se tienen datos de 7598 instituciones con los siguientes campos:
var FacultySchema = mongoose.Schema({ InstitutionName : String, AvgSalaryAll : Number, AVGSalaryProfessors : Number, AVGSalaryAssociateProfessors : Number, AVGSalaryAssistantProfessors : Number, AVGSalaryLecturers : Number, AVGSalaryInstructors : Number, StreetAddress : String, City : String, State : String, ZIPCode : String, MenStaffCount : Number, WomenStaffCount : Number }
Con estos datos, se quiere averiguar, en promedio, las diferencias salariales entre profesores y profesores asociados por estado, para concrear en qué estado está más valorado un profesor asociado respecto a profesor, en términos salariales.
Para responder a la pregunta, el investigador necesita, tras cargar los datos, eliminar aquellos datos que no están completos, porque sean nulos, porque estén como cadena y no como número. Esta operación de limpieza se ejecuta tal que así::
{$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}
Con esto hemos filtrado todas las entidades que tengan valores como cadenas de texto es esos 2 campos concretos. En MongoDB, cada tipo de campo tiene un valor único y para las cadenas, el tipo es el 2.
Este dataset es un buen ejemplo de lo que te puedes encontrar en el mundo real, porque la limpieza de datos es una etapa más del proceso que hay que realizar siempre.
Continuamos, con al siguiente etapa, donde se va a calcular los promerios salariales por estado:
{$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}
Ahora toca ver el resultado de la etapa anterior para obtener la diferencia de media de salario, por estado:
{$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}
Con este cálculo ya tenemos una idea de la diferencia salarial entre el profesor y el profesor asociado con los datos con los que se ha trabajado. Se puede ir un paso más, y proceder a ordenar por el campo calculado usando $sort:
{$sort: { SalaryDifference: 1}}
El resultado es que Idaho, Kansas, y West Virginia son los 3 estados donde las diferencias salariales son menores, en comparación con el resto de estados.
El proceso completo es el siguiente:
[
{$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}},
{$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}},
{$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}},
{$sort: { SalaryDifference: 1}}
]
Y la tabla resultante. Ahora, los investigadores pueden exportar los datos a CSV para proceder a visualizarlos con otras herramientas, incluso con Microsoft Excel.

MongoDB aggregation tutorial
Conclusión
Este ejemplo de uso de MongoDB aggregation pipeline demuestra lo efectiva que es el uso de este tipo de herramientas incluso con datos en producción, para las búsqueda, análisis y construcción de modelos, y por supuesto, que te animes a usarlo!!
Buen día!