@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.