我正在执行聚合,并且正在研究如何在原始聚合方法中执行进一步细分SUM
总计的能力。我目前返回距离内的总事件,按群集代码分组。我想将每个类别的总计数细分。
我知道我可以执行$group
查询
var events = Events.aggregate(
[
{
$match : {
"location.loc" : {
$geoWithin : {
$centerSphere : [[long,lat], milesToRadian(radius) ]
}
}
}
},
{
$group : {
_id : { 'cluster_code' : "$location.cluster_code"},
count : { $sum : 1 }
}
}
]
)
我知道我可以在{"category" : "$category"}
查询中添加额外的参数$group
,以便针对每个类别进行细分。然后我可以执行分组方法来创建我正在寻找的正确格式。这感觉就像我可以改进查询。
我想要实现的是拥有SUM计数,然后计算每个category
的计数。与此类似:
{
"_id": {
"cluster_code": "FK",
},
"Run" : 2,
"Swim" : 1
"count": 3
},
这在单个聚合查询中是否可行?
更新
示例虚拟文件
{
_id : "df",
"location" : {
//...
},
"category" : "Run"
}
答案 0 :(得分:0)
您可以在3.4.4
版本中尝试以下聚合管道。
$group
cluster_code
和category
获取每个分组的计数。
$zip
每个category
键值对分别后跟$arrayToObject
以创建输出格式结构。
使用$addFields
推送cluster_code
& total
data
。{/ p>
使用$replaceRoot
将data
嵌入文档提升到最高级别。
aggregate(
{$group : {
_id : { "cluster_code" : "$location.cluster_code", category:"$category"},
count : { $sum : 1 }
}
},
{$group : {
_id : "$_id.cluster_code",
categorycount : { $push:{category:"$_id.category", count:"$count" }},
total:{$sum:"$count"}
}
},
{$addFields:{data: {$arrayToObject:{$zip:{inputs:["$categorycount.category", "$categorycount.count"]}}}}},
{$addFields:{"data.cluster_code": "$_id", "data.total":"$total"}},
{$replaceRoot:{newRoot:"$data"}}
)