sql >> Database >  >> NoSQL >> MongoDB

Mongo Aggregation:$groep en $projectarray om bezwaar te maken voor tellingen

Met MongoDb 3.4 en nieuwer kunt u gebruikmaken van $arrayToObject operator om het gewenste resultaat te krijgen. U zou de volgende geaggregeerde pijplijn moeten uitvoeren:

db.collection.aggregate([
    { "$group": {
        "_id": {  
            "date": "$install_date",  
            "platform": { "$toLower": "$platform" }
        },
        "count": { "$sum": 1 }
    } },
    { "$group": {
        "_id": "$_id.date",
        "counts": {
            "$push": {
                "k": "$_id.platform",
                "v": "$count"
            }
        }
    } },
    {  "$addFields": {
        "install_date": "$_id", 
        "platform": { "$arrayToObject": "$counts" }
    }  },
    { "$project": { "counts": 0, "_id": 0 } } 
])

Maak voor oudere versies gebruik van de $cond operator in de $group pijplijnstap om de tellingen te evalueren op basis van de platformveldwaarde, ongeveer als volgt:

db.collection.aggregate([    
    { "$group": { 
        "_id": "$install_date",             
        "android_count": {
            "$sum": {
                "$cond": [ { "$eq": [ "$platform", "android" ] }, 1, 0 ]
            }
        },
        "ios_count": {
            "$sum": {
                "$cond": [ { "$eq": [ "$platform", "ios" ] }, 1, 0 ]
            }
        },
        "facebook_count": {
            "$sum": {
                "$cond": [ { "$eq": [ "$platform", "facebook" ] }, 1, 0 ]
            }
        },
        "kindle_count": {
            "$sum": {
                "$cond": [ { "$eq": [ "$platform", "kindle" ] }, 1, 0 ]
            }
        } 
    } },
    { "$project": {
        "_id": 0, "install_date": "$_id",            
        "platform": {
            "android": "$android_count",
            "ios": "$ios_count",
            "facebook": "$facebook_count",
            "kindle": "$kindle_count"
        }
    } }
])

In het bovenstaande, $cond neemt een logische voorwaarde als eerste argument (if) en retourneert vervolgens het tweede argument waarbij de evaluatie waar is (dan) of het derde argument waar onwaar (anders). Dit maakt waar/onwaar retourneert in 1 en 0 om te voeden met $sum respectievelijk.

Dus bijvoorbeeld, als { "$eq": [ "$platform", "facebook" ] }, waar is, wordt de uitdrukking geëvalueerd tot { $sum: 1 } anders is het { $sum: 0 }




  1. Geoptimaliseerde manier van query's in MongoDB met $in vs $or

  2. Probleem bij het retourneren van gegevens die zijn opgehaald uit DB-query's die in de lus worden aangeroepen

  3. Best practices voor databaseback-ups

  4. Herstel redis-gegevens van slave naar master