2014-04-22 35 views
0

我需要聚合 蒙戈骨料與多個聚合類型

- Country: One, Car: Volvo, Name: Smith, Price: 100 
- Country: One, Car: BMW, Name: Smith, Price: 200 
- Country: Two, Car: Romeo, Name: Joe, Price: 50 
- Country: Two, Car: KIA, Name: Joe, Price: 110 
- Country: Two, Car: KIA, Name: Joe, Price: 90 

(名稱是唯一的,每一個都擁有單一國家汽車)

的結果,我希望(不需要多元化以下數據

):

- Name: Smith, Type: Volvos, Country: One, Val: 1 // Count of car-type 
- Name: Smith, Type: BMWs, Country: One, Val: 1 
- Name: Smith, Type: Total, Country: One, Val: 2 // Count of all his cars 
- Name: Smith, Type: Price, Country: One, Val: 300 // Total car price 
- Name: Joe, Type: Romeos, Country: Two, Val: 1 
- Name: Joe, Type: KIAs, Country: Two, Val: 2 
- Name: Joe, Type: Total, Country: Two, Val: 3 
- Name: Joe, Type: Price, Country: Two, Val: 250 

例如這是一個pivotized數據版本中生成報告

Country | Name | Volvos | BMWs | Romeos | KIAs | Total | Price 
---------------------------------------------------------------- 
One  | Smith |  1 | 1 |  |  |  2 | 300 
---------------------------------------------------------------- 
Two  | Joe |  |  |  1 | 2 |  3 | 250 
     | Other |  ? | ? |  ... etc 

我想如果蒙戈聚合框架可以解決這個問題,或者我應該去與鐵桿的map-reduce?

+0

試試這個使用聚合。 bcoz如果數據變大,那麼很難去核心地圖減少 – Mayuri

+0

@Mayuri地圖縮減和聚合是兩個完全不同的pruposes不同的事情,MR不應該內聯運行到您自己的應用程序,例如 – Sammaye

+0

主要問題是我不確定這是否適用於AF。 –

回答

0

聚合應該對此很好。 最簡單的2個獨立的命令...... 如果您收藏被稱爲汽車,你可以像這樣運行的東西:

db.cars.aggregate([{$group:{_id:{"Country":"$Country","Name":"$Name"},"sum":{$sum:1},"price":{$sum:"$Price"}}}]) 


db.cars.aggregate([{$group:{_id:{"Country":"$Country","Name":"$Name","Car":"$Car"},"sum":{$sum:1},"price":{$sum:"$Price"}}}]) 
+0

你的命令的結果並不是我所期望的:每個人沒有*所有車的數量*,並且沒有*每個人的總車價*。 –

+0

@RustemMustafin更新(從_id刪除汽車) –

+0

現在我們錯過了每個人給定類型​​的汽車數量(請參閱Joe有2個KIA和3輛汽車)。 –

1

可能有一些技巧,但這樣做,用的類型,我不相信一個可變數目你可以在一個聚合查詢中得到這一切,但是,你可以將整個表格分成兩部分。

我應該提到的是,總數可以計算出客戶端應該是相當快的。

我還應該注意到,聚合框架目前無法「合併」兩個輸出:http://docs.mongodb.org/manual/reference/operator/aggregation/out/,但您可以對兩個結果進行排序,使其排序相同。

首先,你希望你的總(如果你是通過聚合框架這樣做):

db.cars.aggregate({ 
    {$group: { 
     _id: { 
      Country: '$country', 
      Name: '$Name' 
     }, 
     car_count: {$sum: 1}, 
     value_total: {$sum: '$Val'} 
    }}, 
    {$sort: {_id: 1}} // we now sort by the country and name 
}) 

所以,現在你希望你的每車總數:

db.cars.aggregate({ 
    {$group: { 
     _id: { 
      Country: '$country', 
      Name: '$Name', 
      Type: '$Type' 
     }, 
     sort_key: { // We add this so we can sort the same as the totals 
      Country: '$Country', 
      Name: '$Name' 
     }, 
     car_count: {$sum: 1}, 
     value_total: {$sum: '$Val'} 
    }}, 
    {$sort: {sort_key: 1}} // we now sort by the country and name 
}) 

現在你可以在例如,JavaScript會迭代第一組結果,即總數,在嵌套循環中迭代來自其他聚合的詳細結果,將其全部打印出來。

這可能會比Map Reduce快,但另一種方法是每隔一段時間使用Map Reduce更新一次彙總集合,然後從中挑選出來。這意味着結果不會實時(可能延遲5分鐘),但速度會非常快。

2

不完全是你開的結果,但實際上處於一種MongoDB的方式:

db.cars.aggregate([ 
    { "$group": { 
     "_id": { 
      "name": "$Name", 
      "type": "$Car" 
     }, 
     "Country": { "$first": "$Country" }, 
     "CarCount": { "$sum": 1 }, 
     "TotalPrice": { "$sum": "$Price" } 
    }}, 
    { "$group": { 
     "_id": "$_id.name", 
     "cars": { 
      "$push": { 
       "type": "$_id.type", 
       "country": "$Country", 
       "carCount": "$CarCount", 
       "TotalPrice": "$TotalPrice" 
      } 
     }, 
     "TotalPrice": { "$sum": "$TotalPrice" } 
    }} 
]) 

它給你:

{ 
    "_id" : "Smith", 
    "cars" : [ 
      { 
        "type" : "BMW", 
        "country" : "One", 
        "carCount" : 1, 
        "TotalPrice" : 200 
      }, 
      { 
        "type" : "Volvo", 
        "country" : "One", 
        "carCount" : 1, 
        "TotalPrice" : 100 
      } 
    ], 
    "TotalPrice" : 300 
} 
{ 
    "_id" : "Joe", 
    "cars" : [ 
      { 
        "type" : "KIA", 
        "country" : "Two", 
        "carCount" : 2, 
        "TotalPrice" : 200 
      }, 
      { 
        "type" : "Romeo", 
        "country" : "Two", 
        "carCount" : 1, 
        "TotalPrice" : 50 
      } 
    ], 
    "TotalPrice" : 250 
} 
+0

嘿,mayabe我也可以在汽車中輸入{type:'Total'},然後放鬆結果以獲得完全匹配的集合。那可能嗎? –

+0

@RustemMustafin沒有像我一樣遇到同樣的問題,如果你有一輛車由同一個人組成的兩個不同的國家這些總數不匹配 – Sammaye

+0

@Sammaye這是有效的,因爲我說'每個人都擁有在單一國家的汽車# –