Contenido del curso
Operaciones básicas
Etapas de Aggregation Framework
Operaciones avanzadas
Performance y optimización
Próximos pasos
Funciones JavaScript en MongoDB Aggregation
Resumen
¿Necesitas lógica que los operadores estándar de MongoDB no cubren? Las funciones JavaScript dentro del Aggregation Framework te permiten insertar código personalizado como una etapa más del pipeline, ideal para cálculos específicos que escapan del set tradicional de operadores.
Esta guía está pensada para quienes ya manejan pipelines básicos en MongoDB y quieren extender su capacidad con funciones custom, entendiendo cuándo conviene usarlas y cuándo no.
¿Qué son las funciones personalizadas en MongoDB?
Son bloques de código JavaScript que se ejecutan dentro de una etapa del pipeline. Funcionan como cualquier función JS: reciben argumentos, procesan datos y devuelven un resultado que pasa a la siguiente etapa.
¿Cuándo usar funciones JavaScript en MongoDB? Solo cuando los operadores nativos del Aggregation Framework no cubren tu caso. Son costosas en rendimiento y propensas a errores, así que reserva su uso para lógica muy específica.
¿Por qué cambiar de MongoDB Compass a Visual Studio Code?
La capa gratuita de MongoDB Atlas no permite ejecutar funciones, así que el trabajo se hace desde Visual Studio Code conectado a una instancia local de MongoDB corriendo en Docker [02:00]. Esto elimina las restricciones del tier gratuito y te da control total sobre el entorno.
Desde la pestaña de MongoDB en VS Code puedes verificar la conexión activa y crear archivos de script independientes para cada pipeline.
¿Cómo se estructura un script de Aggregation en VS Code?
Todo script empieza indicando la base de datos con el comando use, propio de MongoDB. Luego seleccionas la colección y aplicas el método de agregación con sus etapas [03:20].
El reto del ejemplo es claro: contar las palabras de la descripción de propiedades de Airbnb y agruparlas por tipo de propiedad para ver si las casas tienden a tener descripciones más largas que los departamentos o galpones.
¿Cómo funciona el operador addFields?
El operador addFields agrega un campo nuevo al documento para que esté disponible en la siguiente etapa del pipeline. En este caso, se crea un campo llamado wordCount que almacenará el resultado de la función personalizada.
javascript use('sample_airbnb'); db.listingsAndReviews.aggregate([ { $addFields: { wordCount: { $function: { body: function(description) { if (description != null) { var words = description.split(" "); return words.length; } else { return 0; } }, args: ["$description"], lang: "js" } } } }, { $group: { _id: "$property_type", avgWords: { $avg: "$wordCount" } } } ])
¿Qué parámetros recibe el operador function?
El operador $function requiere tres llaves específicas que debes configurar correctamente para que la ejecución no falle:
- body: el cuerpo de la función JavaScript con la lógica que quieres ejecutar.
- args: un array con los campos de la colección que se pasarán como argumentos. En el ejemplo,
$descriptionse pasa como parámetro. - lang: el lenguaje de la función. MongoDB permite configurar distintos lenguajes, pero aquí usamos
"js"para JavaScript [07:30].
Dentro del body, la función primero valida que la descripción no sea nula. Recuerda que en MongoDB el esquema es variable, así que siempre debes proteger tu código de campos inexistentes. Si el valor existe, se aplica split(" ") para dividir el texto por espacios y se retorna words.length. Si no existe, retorna cero.
¿Qué hace el método split en JavaScript? Toma un string y lo divide en un array según el carácter que indiques. Con
split(" ")separas un texto en palabras usando el espacio como delimitador.
¿Cómo agrupar resultados por tipo de propiedad?
La segunda etapa usa el operador $group con dos parámetros principales:
- El
_iddefine el campo de agrupación, que aquí es$property_type. - El acumulador
avgWordsaplica el operador$avgsobre el campowordCountgenerado en la etapa anterior.
Al ejecutar el pipeline desde la flecha en la esquina superior de VS Code, el resultado muestra la media de palabras por tipo de propiedad, permitiéndote comparar si las casas usan descripciones más extensas que otros tipos de inmuebles [09:45].
¿Cuándo evitar las funciones personalizadas?
El uso de JavaScript dentro del Aggregation Framework puede emocionar porque te abre la puerta a un lenguaje que ya conoces. Pero hay tres razones para usarlas con cautela:
- Son altamente costosas en términos de rendimiento.
- Son propensas a errores porque introducen otro intérprete dentro de la base de datos.
- La mayoría de operaciones ya están cubiertas por los operadores estándar de MongoDB.
Reserva las custom functions para casos donde realmente no exista un operador nativo equivalente. Antes de escribir código JS, revisa la documentación oficial: probablemente haya un operador que resuelva tu caso con mejor rendimiento.
¿Has tenido que recurrir a funciones JavaScript en alguno de tus pipelines? Cuéntame en los comentarios qué problema resolviste y si lograste reemplazarlo después con operadores nativos.