Som*_*luk 4 mongodb aggregation-framework
我有这样的文件:
{
"platform":"android",
"install_date":20151029
}
Run Code Online (Sandbox Code Playgroud)
还有很多领域。
目标:我正在计算特定日期每个平台的安装量。
因此,我在聚合框架中使用 group by 并按平台进行计数。文档应如下所示:
{
"install_date":20151029,
"platform" : {
"android":1000,
"ios": 2000,
"facebook":1500
}
}
Run Code Online (Sandbox Code Playgroud)
我已经这样做了:
db.collection.aggregate([
{
$group: {
_id: { platform: "$platform",install_date:"$install_date"},
count: { "$sum": 1 }
}
},
{
$group: {
_id: { install_date:"$_id.install_date"},
platform: { $push : {platform :"$_id.platform", count:"$count" } }
}
},
{
$project : { _id: 0, install_date: "$_id.install_date", platform: 1 }
}
])
Run Code Online (Sandbox Code Playgroud)
给出的文档如下:
{
"platform": [
{
"platform": "facebook",
"count": 1500
},
{
"platform": "ios",
"count": 2000
},
{
"platform": "android",
"count": 1000
}
],
"install_date": 20151027
}
Run Code Online (Sandbox Code Playgroud)
问题:
将数组投影到单个对象作为“平台”
使用 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 } }
])
Run Code Online (Sandbox Code Playgroud)
对于旧版本,利用管道步骤$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"
}
} }
])
Run Code Online (Sandbox Code Playgroud)
在上面,$cond采用逻辑条件作为第一个参数 (if),然后返回计算为 true 的第二个参数 (then) 或返回 false (else) 的第三个参数。这使得 true/false 返回到 1 和 0 分别馈送$sum。
例如,如果{ "$eq": [ "$platform", "facebook" ] }, 为 true,则表达式将计算为{ $sum: 1 }else 它将是{ $sum: 0 }