Creación de Funciones Personalizadas en MongoDB con JavaScript

Clase 15 de 21Curso de MongoDB: Aggregation Framework

Contenido del curso

Resumen

Cuando los operadores estándar de MongoDB Aggregation Framework no alcanzan para resolver una lógica compleja, existe una alternativa poderosa: insertar funciones personalizadas en JavaScript directamente dentro del pipeline. Esta capacidad permite cubrir requerimientos específicos que van más allá de lo que ofrecen los operadores tradicionales, aunque su uso debe ser cuidadoso y estratégico.

¿Cómo funcionan las custom functions dentro del pipeline?

Las funciones JavaScript se integran como una etapa más dentro del pipeline de agregación [01:00]. La estructura es sencilla: se define una función que genera un elemento nuevo basado en su resultado, y ese resultado queda disponible para la siguiente etapa del pipeline.

El operador clave para esto es $function, que permite escribir código JavaScript directamente. Este operador recibe tres componentes principales:

  • body: el cuerpo de la función JavaScript.
  • args: un array con los campos de la colección que se pasan como argumentos.
  • lang: el lenguaje de programación, en este caso "js" para JavaScript [07:22].

¿Por qué migrar de MongoDB Compass a Visual Studio Code?

A partir de cierto punto, la capa gratuita de MongoDB Atlas presenta limitaciones que impiden ejecutar funciones personalizadas [01:37]. La solución es trabajar con una instancia local de MongoDB corriendo en Docker, conectada a Visual Studio Code. Esta configuración elimina restricciones y permite trabajar sin límites en los scripts de agregación.

Para comenzar a trabajar en Visual Studio Code, cada script necesita dos instrucciones iniciales [02:42]:

  • use seguido del nombre de la base de datos.
  • Seleccionar la colección y llamar al método de agregación sobre ella.

¿Cómo contar palabras de un campo de texto con JavaScript?

El ejemplo práctico consiste en contar las palabras del campo descripción en las propiedades de Airbnb, agrupándolas por tipo de propiedad [03:20]. El objetivo es determinar si, por ejemplo, las casas tienden a tener descripciones más largas que los departamentos u otros tipos de propiedades.

¿Qué hace el operador $addFields en este contexto?

El operador $addFields agrega un campo nuevo al documento para que esté disponible en las siguientes etapas del pipeline [04:00]. En este caso, se crea un campo llamado wordCount que almacenará el resultado de la función.

La función JavaScript implementada sigue esta lógica:

  • Recibe la descripción como parámetro de entrada.
  • Valida que el valor no sea nulo, algo fundamental en MongoDB dado que el esquema es variable [05:06].
  • Utiliza el método split de JavaScript para dividir la cadena de texto por espacios, separando así las palabras [05:30].
  • Retorna la cantidad de elementos del array resultante mediante .length.
  • Si la descripción no existe, retorna cero para evitar que la función se rompa [06:12].

¿Cómo se completa el pipeline con $group y $avg?

Una vez definida la función, la segunda etapa utiliza el operador $group [07:42]. El parámetro _id se configura con el campo de tipo de propiedad (property_type) para realizar la agrupación.

Dentro del group, se calcula el promedio de palabras usando el operador $avg (average), que hace referencia al campo wordCount generado en la etapa anterior [08:20]. Es importante incluir el prefijo $ para referenciar correctamente el campo.

Al ejecutar el pipeline, el resultado muestra una lista organizada por tipo de propiedad con la media de palabras en el campo descripción [08:55], permitiendo identificar patrones en la longitud de las descripciones.

¿Cuándo es recomendable usar funciones JavaScript en MongoDB?

Aunque la posibilidad de insertar JavaScript en el pipeline resulta atractiva, hay una advertencia importante: las funciones JavaScript son altamente costosas en rendimiento [09:25]. Son propensas a errores porque introducen otro intérprete dentro de la base de datos.

La recomendación es clara:

  • Utilizar custom functions solo cuando los operadores estándar no cubran el requerimiento específico.
  • La gran mayoría de operaciones ya están resueltas con los operadores nativos de MongoDB Aggregation Framework.
  • Priorizar siempre los operadores estándar por rendimiento y estabilidad.

¿Has encontrado algún caso donde las funciones JavaScript fueran la única solución viable en tu pipeline de agregación? Comparte tu experiencia.