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將東西移動到明確數據的「密鑰」中是不好的做法。好的對象具有一致的屬性接口,而不是一直會改變的接口。列表屬於陣列。使用必需的「唯一」名稱在單個對象中列出大量屬性,以便甚至能夠做到這一點是不好的。 –

相關問題