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

Mongo Aggregation:$group og $project array til at gøre indsigelse for tællinger

Med MongoDb 3.4 og nyere kan du udnytte brugen af ​​$arrayToObject operatør for at få det ønskede resultat. Du skal køre følgende samlede pipeline:

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

For ældre versioner, drag fordel af $cond operator i $group pipeline-trin til at evaluere tællingerne baseret på platformens feltværdi, noget i retning af følgende:

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

I ovenstående, $cond tager en logisk betingelse som det første argument (hvis) og returnerer derefter det andet argument, hvor evalueringen er sand (derefter) eller det tredje argument, hvor falsk (andet). Dette gør sand/falsk returnerer til 1 og 0 for at feed til $sum henholdsvis.

Så for eksempel, hvis { "$eq": [ "$platform", "facebook" ] }, er sandt, vil udtrykket evalueres til { $sum: 1 } ellers vil det være { $sum: 0 }




  1. MongoDB - Importer data

  2. actionkabel abonnerer lokalt, men ikke på heroku

  3. MongoDB:Hvordan definerer man et skema?

  4. Sådan kontrolleres, om et indeks er skjult i MongoDB