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 }