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 7

Preguntas 0

Ordenar por:

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

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
      ]}
    }
  }
]
)
Reto: \[ {$unwind: "$amenities"}, {$group: { \_id: "$amenities", cantidad:{ $sum: 1 } } }, { $sort: { cantidad: -1 } }, {$limit: 10}, {$project: { \_id:0, "Facilidad":"$\_id", "cantidad": "$cantidad", "Porcentaje": { $concat:\[ {$toString: {$round:\[ {$multiply: \[ {$divide:\["$cantidad",{$literal: 5600}]}, 100]}, 2]}}, "%"] } }} ]
Para el caso del campo que está fijo que es 5600, lo que he hecho es calcular primero el total, para luego utilizar esa variable y usarlo en donde está fijo 5600, para hacerlo mas dinámica la consulta: ![](https://static.platzi.com/media/user_upload/aggregation-unwind-0c07daaa-64d5-4c6b-973c-09f5dd052f78.jpg)
Solución al reto, definido en 2 cosas: * Redondear el porcentaje a 2 decimales. * Concatenar el signo de porcentaje al cálculo realizado. ```js db.listingsAndReviews.aggregate([ { $unwind: "$amenities" }, { $group: { _id: "$amenities", count: { $sum: 1 } } }, { $sort: { "count": -1 } }, { $limit: 10 }, { $project:{ _id: 0, "Facilidad": "$_id", "Cantidad": "$count", "Porcentaje": { $concat: [ { $convert: { input: { $round: [ { $multiply: [ { $divide: ["$count", {$literal: 5600}] },100 ] }, 2 ] }, to: "string" } }, "%" ] } } } ], { "allowDiskUse" : true }) ```
  • $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