聚合到mongo中的嵌套组中

时间:2016-04-26 19:26:47

标签: mongodb

Mongo可以汇总这些数据:

cat     type     subtype   count
 A       aa           1       10
 A       aa           2       20 
 A       ac           4       15 
 B       ac           3       30 
 C       aa           3       40 
 C       aa           5       50 
 D       ac           6       60 
 D       aa           2       70 

进入如下所示的文档:

   {
     'A': {
            'count': 45,
            'types': [
                {'type': 'aa', count:'30'},
                {'type': 'ac', count:'15'},
            ]
     },
     'B': {
            'count': 30,
            'types': [
                {'type': 'ac', count:'30'},
            ]
     },
     'C': {
            'count': 90,
            'types': [
                {'type': 'ac', count:'90'},
            ]
     },
     'D': {
            'count': 130,
            'types': [
                {'type': 'ac', count:'60'},
                {'type': 'aa', count:'70'},
            ]
     }
  }

基本上,首先按type创建嵌套组,然后按cat创建嵌套组,同时在每个分组级别运行count总计(如果有人熟悉D3,那么&# 39; s具有多个键的rollup函数可以做什么。)

2 个答案:

答案 0 :(得分:0)

在意识到我可以在管道中有多个$ group命令后,我最终解决了这个问题。第一个$组按(cat, type)汇总,第二个$ group汇总第一个(cat)的结果。有点像:

db.mycollection.aggregate([
   {
      $group: {
         _id: {'cat':'$cat','type':'$type'},
         'total': {$sum: $count}
      }
   },
   {
      $group: {
         _id: $_id.cat,
         types: {$push: {type: $_id.type, total: $total}},
         total: {$sum: $total}
      }
   },
   {
      $project: {
        _id: 0,
        cat: $_id.cat
        types: 1,
        total: 1
      }
   }
])

答案 1 :(得分:0)

只是为了修复 Dmrity 自己的答案,因为其中有一些不同的错别字:

db.collection.aggregate([
  {
    $group: {
      _id: {
        cat  : "$cat",
        type : "$type"
      },
      total: {
        $sum: "$count"
      }
    }
  },
  {
    $group: {
      _id: "$_id.cat",
      types: {
        $push: {
          type: "$_id.type",
          total: "$total"
        }
      },
      total: {
        $sum: "$total"
      }
    }
  },
  {
    $project: {
      _id: 0,
      cat: "$_id",
      types: 1,
      total: 1
    }
  }
])