Bạn có thể có một số điều như sau. Sử dụng phép toán đối sánh để lọc ra. Trong ví dụ này, tôi đã chỉ cho bạn thông tin chi tiết về last_week. Tôi đã kiểm tra tất cả các tình huống mà bạn đã đề cập ở trên. Và nó hoạt động tốt
[{$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
]
}
}}]