Khung tổng hợp là những gì bạn muốn:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$year": "$utc_timestamp" },
"month": { "$month": "$utc_timestamp" },
"day": { "$dayOfMonth": "$utc_timestamp" },
},
"defects": {
"$sum": { "$cond": [
{ "$eq": [ "$status", "defect" ] },
1,
0
]}
},
"totalCount": { "$sum": 1 }
}},
{ "$project": {
"defect_rate": {
"$cond": [
{ "$eq": [ "$defects", 0 ] },
0,
{ "$divide": [ "$defects", "$totalCount" ] }
]
}
}}
])
Vì vậy, trước tiên, bạn nhóm vào ngày bằng cách sử dụng các toán tử tổng hợp ngày và nhận được Tổng số lượng các mục vào ngày nhất định. Việc sử dụng $cond toán tử ở đây xác định xem "trạng thái" có thực sự là một khiếm khuyết hay không và kết quả là một $sum có điều kiện trong đó chỉ các giá trị "lỗi" mới được tính.
Khi chúng được nhóm lại mỗi ngày, bạn chỉ cần $divide kết quả, với một séc khác với $cond để đảm bảo rằng bạn không chia hết cho số 0.