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 }