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 }