Vous pouvez avoir quelque chose comme suit. Utilisez l'opération de correspondance pour filtrer. Dans cet exemple, je vous ai montré les détails de la semaine dernière. J'ai vérifié tous les scénarios que vous avez mentionnés ci-dessus. Et ça marche bien
[{$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
]
}
}}]