No tienes acceso a esta clase

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

Persistencia de datos con $out

11/21
Recursos

¿Cómo almacenar resultados de consultas en MongoDB?

En muchas ocasiones, al trabajar con una base de datos en MongoDB, es crucial no solo realizar consultas complejas, sino también almacenar los resultados para su reutilización y acceso rápido. Pero, ¿cómo se puede lograr esto de manera efectiva? La respuesta reside en el uso del operador out, el cual permite generar una nueva colección en tu base de datos con los resultados de un pipeline de agregación. Este enfoque es especialmente útil para exportaciones, reportes, y como caché para consultas frecuentes.

¿Qué es el operador out y para qué se utiliza?

El operador out es una herramienta poderosa que te permite:

  • Crear copias de tus consultas en formato de colección nueva. Ideal para facilitar la exportación de datos.
  • Guardar resultados complejos para acceso rápido y reutilización por otros departamentos o procesos.
  • Preservar consultas como caché que pueden luego usarse en reportes sin necesidad de repetir el procesamiento de datos.

¿Cómo se implementa el operador out en MongoDB Compass?

Un ejemplo práctico de uso del operador out es cuando deseas conocer los barrios más costosos de una ciudad a partir de los datos de propiedades. El proceso en MongoDB Compass implicaría los siguientes pasos:

  1. Ordenamiento de Datos: Comienza con una etapa sort para ordenar las propiedades por precio de manera descendente.

    { $sort: { "address.market": 1, "precio": -1 } }
    
  2. Agrupación de Datos: Emplea una etapa group para agrupar las propiedades por barrio, obteniendo simplemente la propiedad más costosa de cada grupo:

    {
      $group: {
        _id: "$address.market",
        "más costosas": { $first: "$propiedad" },
        precio: { $first: "$precio" }
      }
    }
    
  3. Uso del operador out: Finalmente, utiliza el operador out para almacenar los resultados en una nueva colección llamada propiedades más costosas.

    { $out: "propiedades más costosas" }
    

    Una vez ejecutado, aparecerá una nueva colección con estos resultados en tu base de datos.

Recomendaciones y consideraciones al usar el operador out

El operador out debe ser empleado cuidadosamente en cualquier pipeline por las siguientes razones:

  • Debe ser la última etapa de tu pipeline. Es crucial que todo el procesamiento ocurra antes de empujar los resultados a la nueva colección.
  • Sobrescribe sin confirmar: Si la colección con el mismo nombre ya existe, esta será automáticamente reemplazada.
  • Impacto en rendimiento: Crear nuevas colecciones cada vez que ejecutas un pipeline podría afectar la eficiencia de la base de datos.
  • Pérdida de índices: Si la colección original tenía índices, estos no se transfieren automáticamente a la nueva colección generada.

La práctica con el operador out es esencial, en especial en escenarios donde se necesita proveer datos preprocesados a otros departamentos que no trabajan directamente con MongoDB. Con el uso adecuado, puedes crear pipelines eficientes que beneficien a tu organización en general. ¡Sigue explorando y compartiendo tus hallazgos para continuar aprendiendo y mejorando en el manejo de bases de datos con MongoDB!

Aportes 4

Preguntas 0

Ordenar por:

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

Código visto en clase

db.orders.updateOne( // actualizamos la orden
    { // hacemos match con la orden que queremos actualizar
        _id: ObjectId('649cb8c89f973670e36e123f')   
    },
    {   // mostramos el cambio, agregando un nuevo elemento
        $push: { // agregar elemento
            items: { // quien se lo agrego
                name: 'Producto 1',
                qty: 2,
                price: 12,
                product_id: ObjectId('649923f457514437ac501dd4')  
            }
        },
        $inc: { // incrementador
            total: 12 * 2 // total = total + price * qty
        }
    }
)

//

[
    {$sort: {
        "address.market": 1,
        price: -1
    }},
    {
        $group: {
            _id: "$address.market",
            masCostosas: {
                $first: {
                    name: "$name",
                    price: "$price"
                }
            }
        }
    } ,
    {
        $out: "propiedadesMasCostosas"
    }
]


Dejo mi aporte al curso: ```js use('sample_airbnb') db.listingsAndReviews.aggregate([ { $sort: {"address.market": 1, price: -1 } }, { $group: { _id: "$address.market", masCostosas: { $first:{ nombre:"$name", precio:"$price" } } } }, // con esto guardamos esto como una colección { $out:"Propiedades_Mas_Costosas" } ] ) db.Propiedades_Mas_Costosas.find() ```
Comparto mi solución al reto: ![](https://static.platzi.com/media/user_upload/image-e84db88a-25ca-4512-a248-2e45e26f437e.jpg) Para generar los atributos Nombre de Propiedad, Tipo de propiedad, Imagen de Propiedad, Número de camas, los seleccioné de los atributos ya listos en la info general. Para general el atributo del precio real, decidí sumar los atributos price, security\_deposit, cleaning\_fee de la info general. Para general el atributo del precio con descuento, tomé el atributo del precio real y le resté el 30% (valor arbirtrario). Para el atributo de calificación, decidí tomar el atributo review\_scores.review\_scores\_rating y como está en una escala de 1-100, lo dividí entre 20, para que quedara en una escala de 1-5. Para el atributo número de reviews, tomé el valor del atributo number\_of\_reviews de la info general. Decidí agregarle el atributo de personas permitidas (no es solicitado pero me pareció interesante agregarlo en la tarjeta). Para los valores de Mínima y Máxima Estancia, decidí calcular la fecha del día actual y sumarle los valores de minimum\_nights y maximum\_nights. Para que el mes me quedará en formato de letras, tuve que hacer un array con los meses e indexarlo con el valor resultante del mes extraído de la fecha (esto porque tengo una versión de mongo inferior a la 7.0.0, si ya se cuenta con esta versión o una superior, solo será necesario agregarle el operador correspondiente al momento de formatear la fecha). Dejo mi código en el siguiente comentario.

Aqui mi solucion al reto, aunque no es como me lo esperaba y no me quize complicar 😅.

En la base de datos no hay calificacion de 1-5⭐ asi que use el valor de review_scores_rating que es una puntacion de 1-100 y lo ordene de forma descendente en base al review_scores_rating.

Aqui el codigo 👇

use("sample_airbnb")
db.listingsAndReviews.aggregate([
    {$sort: {
        "review_scores.review_scores_rating": -1
        }
    },
    {
        $project: {
            "_id":0,
          "Nombre de la propiedad:": "$name",
          "Imagen de la propiedad:": "$images.picture_url",
          "Tipo de propiedad:": "$property_type",
          "Numero de camas:": "$beds",
          "Noches minimas de estadia:":"$minimum_nights",
          "Noches maximas de estadia:":"$maximum_nights",
          "Precio:":"$price",
          "Numero de reviews:":"$number_of_reviews",
          "Rating total de las reviews":"$review_scores.review_scores_rating"
        }
    },
    {
        $limit:1000
    },
    {
        $out: "designersReport"
    }
])

Query para ver los resultados

use("sample_airbnb")
db.designersReport.find()