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

Mongo-Aggregation:$group- und $project-Array zum Objekt für Zählungen

Mit MongoDb 3.4 und höher können Sie die Verwendung von $arrayToObject nutzen Operator, um das gewünschte Ergebnis zu erhalten. Sie müssten die folgende aggregierte Pipeline ausführen:

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

Nutzen Sie für ältere Versionen den $cond -Operator in $group Pipeline-Schritt zum Auswerten der Zählungen basierend auf dem Wert des Plattformfelds, etwa wie folgt:

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

Oben $cond nimmt eine logische Bedingung als erstes Argument (wenn) und gibt dann das zweite Argument zurück, wenn die Auswertung wahr ist (dann), oder das dritte Argument, wenn falsch (sonst). Dadurch werden True/False-Rückgaben in 1 und 0 umgewandelt, um $sum zuzuführen bzw.

Also zum Beispiel, wenn { "$eq": [ "$platform", "facebook" ] }, wahr ist, wird der Ausdruck zu { $sum: 1 } ausgewertet andernfalls ist es { $sum: 0 }