skip to Main Content

In a jointed aggregation (with lookup), I’m trying to sum values of a key in the following "resa" field, groupped in a projection (see code snippet #2).

Context:
Here I’m trying to sum the amount of "adultCount" values for every results. Here is the data I’m retrieving before groupping.

 {
    "_id" : ObjectId("626961e60e561759af0b0c5d"),
    "grossValue" : 26.37,
    "netValue" : 23.97,
    "state" : "Closed",
    "resa" : [
        {
            "adultCount" : 1
        }
    ]
}

The full Query here :

db.items.aggregate([
    {
        $match:{
            // matching condition
        }
        
    },
    {
        $lookup:{
             from: 'reservations',
             localField: 'orderId',
             foreignField: 'reservationId',
             as: 'resa',
        }
    },
    {
        $project:{
            _id: 1,
            state: 1,
            grossValue: 1,
            netValue: 1,
            'resa.adultCount': 1
        }
    },
    {
        $group:{
            _id: '$state',
            count: { $sum: 1 },
            grossValue: { $sum: '$grossValue'},
            netValue: { $sum: '$netValue' },
            adults:{$sum: '$resa[0].adultCount'} // <--- HOW TO SUM THE VALUES HERE?
        }
    }
    ]);

Thank you !

2

Answers


  1. Chosen as BEST ANSWER

    Solved my problem :

    adults: { $sum: {
                '$sum':'$resa.adultCount'
            }},
    

    Thanks for helping!


  2. Well if you receive several of those objects in an array, to sum them is fairly straightforward:

    const sum = objectArr.reduce((acc, { resa }) => acc + (resa.reduce((acc, { adultCount }) => acc + (adultCount || 0), ), 0);
    

    It’s a bit clunky just because I’m avoiding any non-numeric additions resulting from a lack of data – if you’re certain of the data being always that structure (i.e. one element in the resa array, always with an adultCount property), then it’s a lot simpler:

    const sum = objectArr.reduce((acc, { resa: [ adultCount ]}) => acc + adultCount, 0);
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search