mongodb聚合已分组的不同组合(分组内部分组)

时间:2018-10-28 16:53:52

标签: mongodb mongodb-query aggregation-framework

我使用的mongoDB具有以下格式的集合。

{name : x  city : AAA , status : active , radius : 1 }
{name : x  city : AAA , status : active , radius : 4  }
{name : x  city : AAA , status : inactive , radius : 7 }
{name : x  city : BBB , status : inactive , radius : 7 }
{name : Y  city : AAA , status : active , radius : 8 }
{name : Y  city : BBB , status : inactive , radius : 5 }
{name : Y  city : BBB , status : inactive , radius : 12 }
{name : Z  city : CCC , status : deleted , radius : 15 }

现在,我想要名称 class 的唯一组合,并且对于该组合​​,还需要状态字段的活动计数,非活动计数和已删除计数的子组。因此总体输出报告将采用以下格式

Name  City  total  Active  Inactive deleted 
 X     AAA    3     2       1         0
 X     BBB    1     0       1         0
 Y     AAA    1     1       0         0
 Y     BBB    2     0       2         0
 Z     CCC    1     0       0         1

由于我是mongodb的新手,因此可以有人建议使用聚集或任何其他方法以最少的查询获取所需输出格式的任何方法吗?

1 个答案:

答案 0 :(得分:3)

您只需要一个$group阶段,即可按名称和城市分组,并且每个activeinactivedeleted字段都有一个条件总和。然后,在最后添加一个$project阶段,以获取所需的确切格式。

db.collection.aggregate([
  {
    $group: {
      "_id": {
        name: "$name",
        city: "$city"
      },
      total: { 
        $sum: 1 
      },
      active: {
        $sum: {
          $cond: [ { $eq: [ "$status", "active" ] }, 1, 0 ]
        }
      },
      inactive: {
        $sum: {
          $cond: [ { $eq: [ "$status", "inactive" ] }, 1, 0 ]
        }
      },
      deleted: {
        $sum: {
          $cond: [ { $eq: [ "$status", "deleted" ] }, 1, 0 ]
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      name: "$_id.name",
      city: "$_id.city",
      total: "$total",
      active: "$active",
      inactive: "$inactive",
      deleted: "$deleted"
    }
  }
])