在返回的聚合结果中计算变量

时间:2017-05-13 15:24:19

标签: javascript mongodb aggregation-framework

我正在执行聚合,并且正在研究如何在原始聚合方法中执行进一步细分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"
}

1 个答案:

答案 0 :(得分:0)

您可以在3.4.4版本中尝试以下聚合管道。

{p} $group cluster_codecategory获取每个分组的计数。

$zip每个category键值对分别后跟$arrayToObject以创建输出格式结构。

使用$addFields推送cluster_code& total data。{/ p>

使用$replaceRootdata嵌入文档提升到最高级别。

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"}}
)