No tienes acceso a esta clase

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

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

15 Días
14 Hrs
31 Min
27 Seg

Manipulando campos con $set

9/21
Recursos

Aportes 5

Preguntas 0

Ordenar por:

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

Solución del reto:

//media del precio, y que muestre el total por cada propiedad
[
  {
    $match: {
      "address.country_code": "US",
    },
  },
  {
    $sort: {
      property_type: 1,
      price: 1,
    },
  },

  // group by $property_type
  {
    $group: {
      _id: "$property_type",
      count:{
        $sum: 1
      },
      priceAvgMedia:{
        $avg: "$price"
      },
      cheaper: {
        $first: {
          nombre: "$name",
          precio: "$price",
          direccion: "$address",
        },
      },
      moreExpensive: {
        $last: {
          nombre: "$name",
          precio: "$price",
          direccion: "$address",
        },
      },
    },
  
  {
    $set:{
      "Tipo de propiedad": "$_id",
      "Cantidad por propiedad": "$count",
      "Precio promedio por propiedad": {$round:["$priceAvgMedia",2]},
      "propiedades destacadas":[
        {
          "tipo":"cheaper",
          "nombre":"$cheaper.nombre",
          "precioDolar":"$cheaper.precio",
          "tipoCambio": 4.00,
          "precioEuro": {$multiply: ["$cheaper.precio", 4.0]}
        },
        {
          "tipo":"moreExpensive",
          "nombre":"$moreExpensive.nombre",
          "precio":"$moreExpensive.precio",
          "tipoCambio": 4.00,
          "precioEuro": {$multiply: ["$moreExpensive.precio", 4.0]}
        }
      ]
    }
  },
  {
    $project:{
      _id:0,
      priceAvgMedia:0,
      count:0,
      cheaper:0,
      moreExpensive:0
    }
  }
  
]
Mi solución: ```js // $set sirve para crear campos nuevos en los documentos de salida. // Se utiliza para agregar nuevos campos a los documentos de entrada o para actualizar los valores de los campos existentes. use("sample_airbnb") db.listingsAndReviews.aggregate([ { $match: {"address.country_code": "US"}, }, { $sort:{ "property_type": 1, "price": 1}, }, { $group: { _id: "$property_type", contarPropiedades: { $sum: 1 }, precioPromedio: { $avg: "$price" }, "masBajo": { $first: { "nombre": "$name", "precio": "$price" } }, "masAlto":{ $last: { // ultimo elemento (mas caro) "nombre": "$name", "precio": "$price" } } } }, { $set:{ "Tipo de propiedad": "$_id", "Cantidad de propiedades": "$contarPropiedades", "Precio promedio": {$round:["$precioPromedio", 2]}, "propiedades destacadas":[ { "tipo":"Mas barata", "nombre":"$masBajo.nombre", "precioDolar":"$masBajo.precio", "precioEuro": {$round:[{$multiply: ["$masBajo.precio", 0.92]},2]} }, { "tipo":"Mas costosa", "nombre":"$masAlto.nombre", "precio":"$masAlto.precio", "precioEuro": {$round:[{$multiply: ["$masAlto.precio", 0.92]},2]} } ] } }, { // excluir campos para evitar duplicados $project: { "_id": 0, "contarPropiedades": 0, "precioPromedio": 0, "masBajo": 0, "masAlto": 0 } } ]) ```
Resolución de tarea con intervalos de precio en dólares y euros:```js use('sample_airbnb') db.listingsAndReviews.aggregate( { $match: { "address.country": "United States" } }, { $sort: { property_type: 1, price: 1, }, }, { $addFields: { exchangeRate: 0.9253 } }, { $group: { _id: "$property_type", countProperties: { $sum: 1 }, avgPriceDolar: { $avg: "$price" }, avgPriceEuro: { $avg: { $multiply: ["$price", "$exchangeRate"] } }, mostExpensive: { $last: { name: "$name", priceDolar: "$price", priceEuro: { $multiply: ["$price", "$exchangeRate"] }, address: "$address" } }, cheapest: { $first: { name: "$name", priceDolar: "$price", priceEuro: { $multiply: ["$price", "$exchangeRate"] }, address: "$address" } } } }, { $set: { "Tipo de Propiedad": "$_id", "Opciones Disponibles": "$countProperties", "Precios en dolares": { "Precio más barato": "$cheapest.priceDolar", "Precio más elevado": "$mostExpensive.priceDolar", "Precio Promedio": { $round: ["$avgPriceDolar", 2] }, }, "Precios en Euros": { "Precio más barato": { $round: ["$cheapest.priceEuro", 2] }, "Precio más elevado": { $round: ["$mostExpensive.priceEuro", 2] }, "Precio Promedio": { $round: ["$avgPriceEuro", 2] }, } } }, { $project: { "_id": 0, "exchangeRate": 0, "countProperties": 0, "avgPriceDolar": 0, "avgPriceEuro": 0, "cheapest": 0, "mostExpensive": 0 } }, { $limit: 10 } ) ```

Excelente!.

Uso de $project y $set:
$project:

  • Si la colección es compleja y requiere formatear datos para el resultado final.

$set:

  • Si la colección es sencillo o tiene pocos campos.
use('sample_airbnb')

db.listingsAndReviews.aggregate([
  {
    $match: {
      "address.country_code": "US"
    }
  },
  {
    $sort: {
    	property_type: 1,
      price : 1
    }
  },
  {
    $group: {
      _id: "$property_type",
      count:{
        $sum: 1
      },
      precioMedia: {
        $avg: "$price"
      },
      masBajo: {
        $first: {
          nombre: "$name",
       	 	precio: "$price",
        	direccion: "$address"
        }
      },
      masAlto: {
        $last: {
          nombre: "$name",
       	 	precio: "$price",
        	direccion: "$address"
        }
      },
    }
  },
  {
    $set:{
      "Tipo de Propiedad": "$_id",
      "Total": "$count",
      "Promedio": { $round: ["$precioMedia", 0] },
      "Precio mas Bajo": { $round: ["$masBajo.precio", 0] },
      "Precio mas Alto": { $round: ["$masAlto.precio", 0] },
      " Propiedades destacadas": [
        {
          "Tipo": "Mas bajo",
          "Nombre": "$masBajo.nombre",
          "Precio": "$masBajo.precio"
        },
        {
          "Tipo": "Mas Alto",
          "Nombre": "$masAlto.nombre",
          "Precio": "$masAlto.precio"
        }
      ]
    }
  },
  {
  $project: {
    _id: 0,
    precioMedia: 0,
    count: 0,
    masBajo: 0,
    masAlto: 0
  }
  }
])