sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo Aggregation:$group och $project array för att invända för räkningar

Med MongoDb 3.4 och nyare kan du utnyttja $arrayToObject operatör för att få önskat resultat. Du skulle behöva köra följande sammanlagda 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 } } 
])

För äldre versioner, dra fördel av $cond operatorn i $group pipeline-steg för att utvärdera antalet baserat på plattformsfältvärdet, ungefär följande:

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 ovanstående, $cond tar ett logiskt villkor som det första argumentet (om) och returnerar sedan det andra argumentet där utvärderingen är sann (då) eller det tredje argumentet där falskt (annat). Detta gör att sant/falskt returneras till 1 och 0 för att mata till $sum respektive.

Så till exempel, om { "$eq": [ "$platform", "facebook" ] }, är sant kommer uttrycket att utvärderas till { $sum: 1 } annars blir det { $sum: 0 }




  1. Hur gör man effektivt distinkt med flera nycklar?

  2. Okänslig sökning i Mongo

  3. $unionWith – MongoDB:s motsvarighet till UNION ALL

  4. Slaget om NoSQL-databaserna - Jämför MongoDB och Cassandra