Sum in each floor by category in aggregation

@Hermann_Samimi I’m sure this is possible to do with aggregation exclusively, but assuming you’re returning a sorted set of data you can do this with JavaScript directly as follows:

var current = { City: null, Cost: null };
var groups = [];
db.aggregate([{
  $documents: [
    { User: "Edvin", Date: "2023-01-01", City: "Paris", Cost: 10 },
    { User: "Edvin", Date: "2023-01-02", City: "Paris", Cost: 7 }, 
    { User: "Edvin", Date: "2023-01-03", City: "Milan", Cost: -9 }, 
    { User: "Edvin", Date: "2023-01-04", City: "Milan", Cost: 6 }, 
    { User: "Edvin", Date: "2023-01-05", City: "Milan", Cost: 25 }, 
    { User: "Edvin", Date: "2023-01-06", City: "Berlin", Cost: 3 }, 
    { User: "Edvin", Date: "2023-01-07", City: "Berlin", Cost: 17.5 }, 
    { User: "Edvin", Date: "2023-01-08", City: "Paris", Cost: 4 }, 
    { User: "Edvin", Date: "2023-01-9", City: "Paris", Cost: 5 }, 
    { User: "Edvin", Date: "2023-01-10", City: "Milan", Cost: 1 }, 
    { User: "Edvin", Date: "2023-01-11", City: "Paris", Cost: 9 }, 
    { User: "Edvin", Date: "2023-01-12", City: "Berlin", Cost: 12 }, 
    { User: "Edvin", Date: "2023-01-13", City: "Berlin", Cost: 1.5 }, 
    { User: "Edvin", Date: "2023-01-14", City: "Berlin", Cost: 3.2 },  
]}]).forEach((d) => {  
  if (current.City != d.City) {    
    if (current.Cost != null) {
      groups.push(current);
    }
    current = { City: d.City, Cost: d.Cost }; 
  } else {
    current.Cost += d.Cost;
  }  
});
groups.push(current);
console.log(groups);

Note that $documents here is just used to avoid creating a collection to insert the data into, but you could replace that with a db.coll.find({ .... }).sort({ Date: 1 }) just as easily.

1 Like