Javascript 如何在mongodb中按多个字段进行聚合

Javascript 如何在mongodb中按多个字段进行聚合,javascript,node.js,mongodb,mongodb-query,aggregation-framework,Javascript,Node.js,Mongodb,Mongodb Query,Aggregation Framework,我想聚集2个字段,并希望有一个嵌套的方式进行凿。我如何做到这一点?目前,我以以下方式进行分组 var query = [ { '$group': { '_id': { 'employee': '$employee', 'sector': '$sector' }, 'bookCount': { '$sum': 1 } }}, { '$sort': { 'count': -1 } } ]; Order.aggregate(query, f

我想聚集2个字段,并希望有一个嵌套的方式进行凿。我如何做到这一点?目前,我以以下方式进行分组

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为员工,sector1、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}}
不能在聚合框架中将“数据”用作“键名”,也不能创建具有嵌套属性的嵌套对象。你也不应该这样做,因为这是一种“反模式”。数据就是数据,应该保持这种状态。此外,还有更好的方法:

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
                    }
            ]
    }
]
因此,您有一个用于“employee”值的主分组键,其他结果被“推”到一个数组中


这是一种更好的结构,在密钥命名方面具有一致的结果。

显示原始文档。为什么将嵌套模式称为“反模式”?我试着使用那个表格,因为从使用的角度来看,它似乎更方便。使用数据值作为键名不是正确的做法吗?在我发布了这个问题之后,我编写了一些代码来处理聚合返回的数据,并以嵌套格式返回到client@raju将东西移动到“关键点”中(显然是数据)是不好的做法。好的对象有一个一致的属性接口,而不是一个总是变化的接口。列表属于数组。在单个对象中列出大量属性,并使用所需的“唯一”名称,以便能够做到这一点,这是不好的。