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 }