sql >> Database >  >> NoSQL >> MongoDB

Groeperen op voorwaarde in MongoDB

Het aggregatieraamwerk is wat u wilt:

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

Dus eerst groepeert u op de dag met behulp van de datumaggregatie-operators en krijgt u het totale aantal items op de gegeven dag. Het gebruik van de $cond operator bepaalt hier of de "status" daadwerkelijk een defect is of niet en het resultaat is een voorwaardelijke $sum waarbij alleen de "defect"-waarden worden geteld.

Zodra deze per dag zijn gegroepeerd, $divide het resultaat, met nog een controle met $cond om er zeker van te zijn dat je niet door nul deelt.



  1. MongoDB logt alle vragen

  2. 6 cruciale Redis-bewakingsstatistieken die u moet bekijken

  3. Array-elementen opvragen met Mongo

  4. Hoe kan ik een booleaans veld in één document wisselen met atomaire bewerking?