sql >> Databasteknik >  >> NoSQL >> MongoDB

Gruppera efter skick i MongoDB

Aggregeringsramverket är vad du vill ha:

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 grupperar du dagen med hjälp av datumaggregationsoperatorerna och får det totala antalet artiklar på den givna dagen. Användningen av $cond operatorn här bestämmer om "status" faktiskt är en defekt eller inte och resultatet är en villkorad $sum där endast "defekt"-värdena räknas.

När de är grupperade per dag $divide resultatet, med ytterligare en kontroll med $cond för att se till att du inte dividerar med noll.



  1. Genomsnittligt ett underdokumentfält över dokument i Mongo

  2. Kan inte starta MongoDB som en tjänst

  3. MongoError:Kan inte extrahera geonycklar från objekt med Type :Point

  4. 3 enkla steg för att skapa MongoDB Sharded Clusters