2015-11-07 69 views
-2

說我有一個返回以下內容的聚合:MongoDB的總和數組對象

[ 
    {driverId: 21312asd12, cars: 2, totalMiles: 30000, family: 4}, 
    {driverId: 55512a23a2, cars: 3, totalMiles: 55000, family: 2}, 
    ... 
    ] 

我怎麼會去運行的每個數據的groupId基礎返回以下設定的總和?我是否使用$ unwind?做另一個分組?

比如我想回:

{ 
    totalDrivers: 2, 
    totalCars: 5, 
    totalMiles: 85000, 
    totalFamily: 6 
} 

回答

1

你似乎只是參照輸出作爲「陣列」的文件,因此只需添加另一個$group到您的管道末端:

{ "$group": { 
    "_id": null, 
    "totalDrivers": { "$sum": 1 }, 
    "totalCars": { "$sum": "$cars" }, 
    "totalMiles": { "$sum": "$totalMiles" }, 
    "totalFamily": { "$sum": "$family" } 
}} 

哪裏null本質上只是一個空組密鑰是不存在的文件組中的一個字段。結果應該是單個文檔(儘管在數組中,取決於使用的API方法調用或服務器版本)。

或者,如果你實際上意味着每個文件有一個字段與一個這樣的數組,然後$unwind並且或者每個文檔或與如上述一null處理組:

{ "$unwind": "$someArray" }, 
{ "$group": { 
    "_id": "$_id", 
    "totalDrivers": { "$sum": 1 }, 
    "totalCars": { "$sum": "$someArray.cars" }, 
    "totalMiles": { "$sum": "$someArray.totalMiles" }, 
    "totalFamily": { "$sum": "$someArray.family" } 
}} 

在任何速率,則應該在提問這樣​​的問題時,確實發佈了您正在使用的代碼。很可能您的管道可能不如您想象的那樣有效地達到您的最終目標,並且如果您發佈該管道,它們都會清楚地表明您正在做什麼以及如何爲改進提供建議。

+0

我其實用你提到的第一種方法算出來,但是你打我發佈答案,所以我會提高你的答案! – xxyyzz