MongoDb 3.4以降では、 $arrayToObject
の使用を活用できます。 演算子を使用して、目的の結果を取得します。次の集約パイプラインを実行する必要があります:
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 } }
])
古いバージョンの場合は、 $cond
を利用してください $group
の演算子 次のようなプラットフォームフィールド値に基づいてカウントを評価するパイプラインステップ:
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"
}
} }
])
上記では、 $cond
最初の引数(if)として論理条件を取り、評価がtrue(then)の場合は2番目の引数、false(else)の場合は3番目の引数を返します。これにより、true / falseが1と0に戻り、$sum
にフィードされます。 それぞれ。
たとえば、{ "$eq": [ "$platform", "facebook" ] },
の場合 trueの場合、式は{ $sum: 1 }
に評価されます それ以外の場合は、{ $sum: 0 }
になります