MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Gruppieren nach Bedingung in MongoDB

Das Aggregations-Framework ist das, was Sie wollen:

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" ] }
            ]
        }
    }}
])

Also gruppieren Sie zuerst nach dem Tag, indem Sie die Datumsaggregationsoperatoren verwenden, und erhalten die Gesamtzahl der Elemente an dem angegebenen Tag. Die Verwendung von $cond Der Operator bestimmt hier, ob der "Status" tatsächlich ein Fehler ist oder nicht, und das Ergebnis ist eine bedingte $sum wobei nur die "defekten" Werte gezählt werden.

Sobald diese pro Tag gruppiert sind, $divide Sie einfach das Ergebnis, mit einer weiteren Prüfung mit $cond um sicherzustellen, dass Sie nicht durch Null dividieren.