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.