No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Creación de Funciones Personalizadas en MongoDB con JavaScript

15/21
Recursos

¿Qué es el MongoDB Aggregation Framework?

El MongoDB Aggregation Framework es un conjunto de herramientas poderosas que permite manipular y transformar documentos en una base de datos MongoDB mediante operadores diversos. Hasta ahora, hemos explorado muchos operadores que cumplen diferentes requisitos en la construcción de pipelines de datos. Sin embargo, hay situaciones en las que necesitamos ir más allá, especialmente cuando la lógica es compleja y no está cubierta por los operadores disponibles.

¿Cómo usar funciones JavaScript en MongoDB?

Para superar las limitaciones de los operadores disponibles, MongoDB permite la inclusión de funciones personalizadas escritas en JavaScript. Esto es particularmente útil para satisfacer requerimientos específicos. Integrar funciones en nuestros scripts de MongoDB no es complejo y nos da la flexibilidad para crear contenido nuevo o elementos adicionales basados en los resultados de nuestra función personalizada.

¿Cómo configurar Visual Studio Code para MongoDB?

A partir de este punto, se recomienda usar Visual Studio Code en lugar de MongoDB Compass para realizar tareas de MongoDB, dado que ofrece más flexibilidad. Aquí van algunos pasos:

  1. Verifica la conexión: Asegúrate de que Visual Studio Code esté configurado y conectado correctamente a un contenedor de Docker que ejecute MongoDB localmente, evitando así las limitaciones de MongoDB Atlas.
  2. Configura el entorno de trabajo: Usa la pestaña de MongoDB en Visual Studio Code para verificar las conexiones activas.
  3. Crea y organiza scripts: En la sección de archivos, organiza documentos para cada script de Aggregation Framework que quieras realizar.

¿Cómo contar palabras en MongoDB usando JavaScript?

Supongamos que queremos contar las palabras en las descripciones de propiedades de Airbnb, agrupadas por tipo de propiedad. La lógica detrás de esta operación puede ejecutarse mediante un script JavaScript:

db.collection.aggregate([
  {
    $addFields: {
      wordCount: {
        $function: {
          body: function(description) {
            if (description) {
              return description.split(' ').length;
            } else {
              return 0;
            }
          },
          args: ["$description"],
          lang: "js"
        }
      }
    }
  },
  {
    $group: {
      _id: "$propertyType",
      averageWordCount: { $avg: "$wordCount" }
    }
  }
]);

¿Cuáles son las recomendaciones para el uso de funciones JavaScript?

Aunque poder usar JavaScript dentro de MongoDB puede resultar emocionante y ofrece un gran poder a quienes ya están familiarizados con dicho lenguaje, es importante tener precaución. Las funciones JavaScript en MongoDB pueden ser costosas en términos de rendimiento y propensas a errores. Por lo tanto, es crucial que estas funciones sean utilizadas solo en casos específicos donde no hay operadores estándar de MongoDB que puedan resolver el problema. La mayoría de las necesidades de agregación pueden ser satisfechas con los operadores ya existentes en MongoDB.

Con estas recomendaciones y conocimientos, puedes seguir adelante y descubrir más sobre cómo MongoDB puede ayudarte a transformar y presentar los datos de manera efectiva.

Aportes 5

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En el caso te aparezca el error: "$function not allowed in this atlas tier" Investigando sobre tema en la documentación de MongoDB, se puede ver las acciones no respaldadas o "Unsuported Actions". Actualmente, las instancias sin servidor no admiten las siguientes acciones: Usar JavaScript del lado del servidor, como $where, $function, $accumulator y map-reduce. Puedes revisar esta información en la siguiente link: <https://www.mongodb.com/docs/atlas/reference/serverless-instance-limitations/> Seguramente en el momento en que hago el curso, utilizar funciones sea por medio de una versión más alta de MongoDB o de paga. Adjunto una solución similar sin "$function" para poder suplir la consulta de esta clase: ```js use('sample_airbnb') db.listingsAndReviews.aggregate([ { $addFields:{ wordCount:{ $cond: { if: { $eq: ["$descripcion", null] }, then: 0, else: { $size: { $split: [{ $ifNull: ["$descripcion", ""] }, " "] } } } } } }, { $group:{ _id: "$property_type", averageWordCount:{$avg: "$wordCount"} } } ]) ```

El ejemplo lo ejecute localmente en mongoDB. Para eso tuve que crear una base de datos e importar todas las colecciones de mongoDb atlas.

var db=db.getSiblingDB("sample_airbnb")

var resultado=db.listingsAndReviews.aggregate(
    {
        $addFields:{
            wordCount:{
                $function:{
                    body: function(description){
                        if(description){
                            var words = description.split('');
                            return words.length;
                        } else{
                            return 0
                        }
                    },
                    args:["$description"],
                    lang:"js"
                }
            }
        }
    },
    {
        $group:{
            _id:"$property_type",
            averageWordCount:{ $avg: "$wordCount"}
        }
    },
    {
        $count: "cantidad",
      }

)

print(resultado)

#Resultado
[ { cantidad: 36 } ]
Dejo mi aporte: ```js //Crear una funcion para contar la cantidad de palabras que la gente usa en las descripciones use('sample_airbnb') db.listingsAndReviews.aggregate([ { $addFields: { contadorPalabras: { $cond: { if: { $ne: ["$description", null] }, then: { $size: { $split: ["$description", " "] } }, else: 0 } } } }, { $group: { _id: "$property_type", promedioDePalabras: { $avg: "$contadorPalabras" } } }, { $project: { _id: 1, promedioDePalabras: { $round: ["$promedioDePalabras", 2] } } }, { $sort: { promedioDePalabras: -1 } } ]) ```
Si tampoco me dejo con function, mi alternativa a continuación://Crear una funcion para contar la cantidad de palabras que la gente usa en las descripcionesuse('sample\_airbnb') db.listingsAndReviews.aggregate(\[  {    $addFields: {      contadorPalabras: {        $cond: {          if: { $ne: \["$description", null] },          then: { $size: { $split: \["$description", " "] } },          else: 0        }      }    }  },  {    $group: {      \_id: "$property\_type",      promedioDePalabras: { $avg: "$contadorPalabras" }    }  },  {    $project: {      \_id: 1,      promedioDePalabras: { $round: \["$promedioDePalabras", 2] }    }  },   {    $sort: {      promedioDePalabras: -1    }  } ]) ```js //Crear una funcion para contar la cantidad de palabras que la gente usa en las descripciones use('sample_airbnb') db.listingsAndReviews.aggregate([ { $addFields: { contadorPalabras: { $cond: { if: { $ne: ["$description", null] }, then: { $size: { $split: ["$description", " "] } }, else: 0 } } } }, { $group: { _id: "$property_type", promedioDePalabras: { $avg: "$contadorPalabras" } } }, { $project: { _id: 1, promedioDePalabras: { $round: ["$promedioDePalabras", 2] } } }, { $sort: { promedioDePalabras: -1 } } ]) ```
use('sample_airbnb')

db.listingsAndReviews.aggregate([
  {
    $addFields:{
      wordCount: {
        $function:{
          body:function(descripcion){
            if(descripcion){
              const words = descripcion.split(' ')
              return words.length
            }else{
              return 0
            }
          },
          args: ["$description"],
          lang: "js"
        }
      }
    }
  },
  {
    $group: {
      _id: "$propery_type",
      averageWordCount: {$avg: "$wordCount"}
    }
  }
])