Możesz mieć coś takiego jak obserwowanie. Użyj operacji dopasowania, aby odfiltrować. W tym przykładzie pokazałem ci szczegóły z ostatniego tygodnia. Sprawdziłem wszystkie scenariusze, o których wspomniałeś powyżej. I działa dobrze
[{$match: {
$expr:{
$and:[
{$gt:["$createdAt",new Date(new Date()-14*60*60*24*1000)]},
{$lt:["$createdAt",new Date(new Date()-7*60*60*24*1000)]}
]
}
}}, {$group: {
_id: '$userId',
totalSeen: {
$sum: {
$cond: [
{
$eq: [
'$status',
'seen'
]
},
1,
0
]
}
},
total: {
$sum: 1
}
}}, {$project: {
_id: 0,
userId: '$_id',
notificationPercentage: {
$multiply: [
{
$divide: [
'$totalSeen',
'$total'
]
},
100
]
}
}}]