No tienes acceso a esta clase

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

Usando funciones personalizadas con $accumulator

17/21
Recursos

Aportes 4

Preguntas 0

Ordenar por:

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

En el caso te aparezca el error: "$accumulator not allowed in this atlas tier" En la anterior clase comenté un post similar. Actualmente, las instancias sin servidor no admiten las siguientes acciones: Usar JavaScript del lado del servidor, como $where, $function, $accumulator y map-reduce. Seguramente es mi versión de MongoD en el momento que hago el curso. Puedes utilizar esta solución provisional sin "$accumulator" para esta consulta: ```js use('sample_airbnb'); db.listingsAndReviews.aggregate([ { $match: { "review_scores.review_scores_rating": { $gt: 90 } } }, { $addFields: { amenitiesSize: { $size: "$amenities" } } }, { $group: { _id: null, amenitiesSizes: { $push: "$amenitiesSize" } } }, { $unwind: "$amenitiesSizes" }, { $group: { _id: null, total: { $sum: "$amenitiesSizes" }, count: { $sum: 1 } } }, { $addFields: { media: { $round: [{ $divide: ["$total", "$count"] }, 2] } } }, { $project: { media: 1 } } ]) ```
```js // experimento para saber la media de amenities por rating desde 91% al 100% use('sample_airbnb') db.listingsAndReviews.aggregate([ { $match: {"review_scores.review_scores_rating": {$gt: 90}} }, { $addFields: { amenitiesSize: {$size: "$amenities"} } }, { $group: { _id: "$review_scores.review_scores_rating", totalAmenities: { $sum: "$amenitiesSize" }, totalProperties: { $sum: 1 } } }, { $sort: { _id: -1 } }, { $project: { property_score: "$_id", _id: 0, mediaAmenities: { $divide: ["$totalAmenities", "$totalProperties"] } } } ]) ```
var db=db.getSiblingDB("sample_airbnb")

db.listingsAndReviews.aggregate([
    {
        $match: {
            "review_scores.review_scores_rating": { $gte: 90},
        }
    },
    {
        //para guadar el acumulador en un campo
        $addFields:{
            amenitiesSize: {$size: "$amenities"}
        }
    },
    {
        $group: {
          _id: null,
          media: {
            $accumulator: {
                init: function(){
                    return {sum:0, count:0};
                },

                accumulateArgs:["$amenitiesSize"],

                accumulate: function(state, size){
                    return {sum: state.sum + size, count: state.count+1};
                },

                // se crea una funcion para juntar documentos
                merge: function(state1, state2){
                    return {
                        sum: state1.sum + state2.sum,
                        count: state1.count + state2.count
                    };
                },

                //finalizar
                finalize: function(state){
                    return state.sum /state.count
                },
                lang:"js"
          }
        }
      }
    }
]
);

#resultado
[
  {
    "_id": null,
    "media": 24.81186283595922
  }
]


use('sample_airbnb')

db.listingAndReviews.aggregate([
    {
        $match: {"review_scores.review_scores_raiting": {$gt: 90}}
    },
    {
        $addFields: {
            amenitiesSize: {$size: "$amenities"}
        }
    },
    {
        $group: {
            _id: null,
            media: {
                $accumulator: {
                    init: function() {
                         return {sum: 0, count: 0};
                    },

                    accumulateArgs: ["$amenitiesSize"],
                    accumulate: function(state, size){
                        return{sum: state.sum + size, count: state.count +1};
                    },

                    merge: function(state1, state2){
                        return {
                            sum: satet1.sum + state2.sum,
                            count: state1.count + state2.count,
                        };
                    },

                    finalize: function(state) {
                        return state.sum / state.count
                    },

                    lang: "js"
                    }
                }
            }
        }
])