No tienes acceso a esta clase

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

Trabajando con arrays y $unwind

10/21
Recursos

Aportes 4

Preguntas 0

Ordenar por:

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

o inicia sesión.

Comparto mi solución de cómo redondeé el porcentaje. En mi caso, decidí dejar solo un decimal.

use('sample_airbnb')

db.listingsAndReviews.aggregate(
	[
  {
    $unwind: "$amenities"
  },
  {
    $group: {
      _id: "$amenities",
    	count: { $sum: 1 }
    }
  },
  {
    $sort: {
      count: -1
    }
  },
  {
    $limit: 3
  },
  {
    $project: {
      _id:0,
      facilidad: "$_id",
      cantidad: "$count",
      porcentaje: {$round: [
        {
        $multiply:[
          {$divide: [
            "$count",
            {
              $literal: 5600
            }
          ]},
          100
        ]
      },1
      ]}
    }
  }
]
)
  • $unwind permite DESENREDAR el contenido del array para poder maniupularlo.
  • $multiply multiplica numeros y arroja un resultado, se le pasan los numeros en un array
  • $divide DIVIDE un numero por otro y arroja un resultado, se la pasan los dos numeros en un array.
  • $literal retorna un valor sin parsear. se utiliza para valores que quizas sean interpretados como expresiones por la pipeline de agregacion.
// ejemplo $limit
{ $literal: { $add: [ 2, 3 ] } }

// resultado
{ "$add" : [ 2, 3 ] } 

solución al reto propuesto:



[
    {
      $unwind: "$amenities",
    },
    {
      $group: {
        _id: "$amenities",
        cuenta: {
          $sum: 1,
        },
      },
    },
    {
      $sort: { cuenta: -1 },
    },
    {
      $limit: 10,
    },
    {
      $project: {
        _id: 0,
        facilidad: "$_id",
        cantidad: "$cuenta",
        porcentaje: {
          $round: [
            {
              $multiply: [
                {
                  $divide: [
                    "$cuenta",
                    { $literal: 5600 },
                  ],
                },
                100,
              ],
            },
            3,
          ],
        },
      },
    },
  ]

Al utilizar $unwind, y al consultar en un arrays puede ser que ls recuersos en memoria aumente, ya que mientras mas cantidad de documentos tenga la colección habra un full scan. Hay que evaluar la perfomance.

Se podría optimizar con la utilización de index , teniendo en cuenta el plan de ejecución de la consulta.

https://www.mongodb.com/docs/manual/core/query-optimization/#covered-query