Hi there,
I am trying to create an aggregation to sum actual play time from documents that have a startTime and an endTime.
the data is inside an array inside a document.
what makes it tricky is that I am calculating sum of game Sessions for a few different games so I need to group by gameName/Id and produce total playtime for each game.
is this achievable ?
cument for example:
device:
id: "7863",
deviceSN: "378623",
"gameSessions": [
{
"deviceSN": "180322905602120",
"endTime": 1633520201,
"gameId": "5cf6426984c42d6c2775b6be",
"gameName": "Lumberjacks",
"playmode": "Wall",
"gameEvents": [],
"points": [
{
"count": 134,
"GridColumn": 0,
"GridRow": 0
},
{
"count": 29,
"GridColumn": 1,
"GridRow": 0
},
{
"count": 24,
"GridColumn": 2,
"GridRow": 0
},
{
"count": 0,
"GridColumn": 0,
"GridRow": 1
},
{
"count": 88,
"GridColumn": 1,
"GridRow": 1
},
{
"count": 44,
"GridColumn": 2,
"GridRow": 1
},
{
"count": 0,
"GridColumn": 0,
"GridRow": 2
},
{
"count": 14,
"GridColumn": 1,
"GridRow": 2
},
{
"count": 3,
"GridColumn": 2,
"GridRow": 2
}
],
"profile": {
"name": "General",
"uuid": ""
},
"startTime": 1633519873
}
}
there are more fields to the object but I just need to display top 5 played games from the gameSessions array.
here is what i have so fat that produces an empty array
.aggregate([
{ $addFields: {
PreviousDate: { $subtract: [ new Date(), (1000*60*60*24*30) ] }
}
},
{$match:{ deviceSN: "180733444101861",
createdAt:{$gte:new Date("07-08-2021") , $lt: new Date("$PreviousDate")}}},
{ $unwind: "$gameSessions" },
{ $group:
{
_id: "$gameSessions.gameId", // Group key
hoursPlayed: {$sum: { $dateDiff:{
startDate: '$startTime',
endDate: '$endTime',
unit: 'hour'}}},
}
}
]).toArray()