Le cadre d'agrégation est ce que vous voulez :
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" ] }
]
}
}}
])
Donc, d'abord, vous regroupez le jour en utilisant les opérateurs d'agrégation de date et obtenez le nombre total d'éléments le jour donné. L'utilisation du $cond
l'opérateur ici détermine si le "statut" est réellement un défaut ou non et le résultat est un $sum
conditionnel où seules les valeurs "défaut" sont comptées.
Une fois ceux-ci regroupés par jour, il vous suffit de $divide
le résultat, avec une nouvelle vérification avec $cond
pour vous assurer que vous ne divisez pas par zéro.