sql >> Database teknologi >  >> NoSQL >> MongoDB

Gruppér efter tilstand i MongoDB

Aggregeringsrammen er, hvad du ønsker:

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

Så først grupperer du på dagen ved hjælp af datosammenlægningsoperatorerne og får det samlede antal varer på den givne dag. Brugen af ​​$cond operatør bestemmer her, om "status" faktisk er en defekt eller ej, og resultatet er en betinget $sum hvor kun "defekt"-værdierne tælles.

Når disse er grupperet pr. dag, $divide resultatet, med endnu en kontrol med $cond for at sikre, at du ikke dividerer med nul.



  1. Aggregate $lookup returnerer ikke elementernes oprindelige array-rækkefølge

  2. Hent BinData UUID fra Mongo som streng

  3. MongoDB - Opret en sikkerhedskopi

  4. Bedste Session Storage Middleware til Express + MongoDB