A estrutura de agregação é o que você deseja:
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" ] }
]
}
}}
])
Então, primeiro você agrupa no dia usando os operadores de agregação de data e obtém o totalCount de itens no dia determinado. O uso do
$cond
O operador aqui determina se o "status" é realmente um defeito ou não e o resultado é um $sum
condicional onde apenas os valores de "defeito" são contados. Uma vez que eles são agrupados por dia, você simplesmente
$divide
o resultado, com outra verificação com $cond
para ter certeza de que você não está dividindo por zero.