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 }