0

我想聚合2个字段并希望以嵌套的方式完成拼接。我如何实现它?目前,我做了分组在下列方式如何通过mongodb中的多个字段进行聚合

var query = [ 
    { '$group': { 
    '_id': { 
     'employee': '$employee', 
     'sector': '$sector' 
    }, 
    'bookCount': { '$sum': 1 } 
    }}, 
    { '$sort': { 'count': -1 } } 
]; 

Order.aggregate(query, function(err, results){ 
    res.json(results) 
}); 

我想要的结果是在形式

{abc:{sector1:4, sector3:5}, xyz: {sector1:10, sector2:23}} 

其中ABC,XYZ是员工和扇区1,sector2的行业。

如何聚合以获得嵌套结果?

我的原稿是

[ 
    { 
    "sector": "sector1", 
    "employee": "xyz" 
    }, 
    { 
    "sector": "sector1", 
    "employee": "abc" 
    }, 
    { 
    "sector": "sector1", 
    "employee": "abc" 
    }, 
    { 
    "sector": "sector2", 
    "employee": "abc" 
    } 
] 

我想结果是这样的形式

{abc:{sector1:2,sector2:2}, xyz: {sector1:1}} 
+0

显示您的原始文档。 –

回答

2

不能使用“数据”作为聚合框架“键名”,而你也不能使用嵌套属性创建嵌套对象。你也不应该这么想,因为这是一种“反模式”。数据是数据,应该保持这种状态。另外,有更好的方法来做到这一点:

Order.aggregate([ 
    { "$group": { 
     "_id": { 
      "employee": "$employee", 
      "sector": "$sector" 
     }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$group": { 
     "_id": "$_id.employee", 
     "sectors": { 
      "$push": { 
       "sector": "$_id.sector", 
       "count": "$count" 
      } 
     } 
    }} 
],function(err,docs) { 

}); 

它返回一个像这样的结构:

[ 
    { 
      "_id" : "xyz", 
      "sectors" : [ 
        { 
          "sector" : "sector1", 
          "count" : 1 
        } 
      ] 
    }, 
    { 
      "_id" : "abc", 
      "sectors" : [ 
        { 
          "sector" : "sector2", 
          "count" : 1 
        }, 
        { 
          "sector" : "sector1", 
          "count" : 2 
        } 
      ] 
    } 
] 

所以,你必须对“员工”的价值观和其他结果的主分组键被“推送“到一个数组。

这是一个更好的结构,在键的命名上有一致的结果。

+0

你为什么称嵌套模式为“反模式”?我试图得到这种形式,因为从使用的角度来看,它似乎更方便。使用数据值作为关键名称不是正确的事情吗?在我发布这个问题后,我编写了一些代码来处理聚合返回的数据,并且以嵌套格式返回给客户端 – raju

+1

@raju将东西移动到明确数据的“密钥”中是不好的做法。好的对象具有一致的属性接口,而不是一直会改变的接口。列表属于阵列。使用必需的“唯一”名称在单个对象中列出大量属性,以便甚至能够做到这一点是不好的。 –

相关问题