2017-10-13 54 views
0

當使用$組時,有沒有什麼方法可以使用加權平均而不是$ avg組累加器?我用這個(How do I calculate a weighted average in mongoDB using aggregation framework?)作爲加權平均值,但是我得到的錯誤是「字段'id:WAVG_A'必須指定一個累加器」。是否有某種黑客使用投影而不是組累加器?

我聚集JSON的一個子集是在這裏:

{ 
    "$group":{ 
     "_id":{ 
     "id:DIM_1":"$id:DIM_1", 
     "id:DIM_2":"$id:DIM_2" 
     }, 
     "id:WAVG_A":{ 
     "$group":{ 
      "_id":"weighted average", 
      "nu":{ 
       "$sum":{ 
        "$multiply":[ 
        "$id:WAVG_A", 
        "$id:MET_A" 
        ] 
       } 
      }, 
      "de":{ 
       "$sum":"$id:MET_A" 
      } 
     }, 
     "$project":{ 
      "average":{ 
       "$divide":[ 
        "$nu", 
        "$de" 
       ] 
      } 
     } 
     }, 
     "id:MET_A":{ 
     "$sum":"$id:MET_A" 
     } 
    } 
} 

編輯

爲了簡化問題,讓我嘗試和使用類似於設在蒙戈現場採樣數據解釋我的問題。比方說,你有這樣的數據:

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "weight" : 1, "date" : ISODate("2014-03-01T08:00:00Z") } 
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "weight" : 1, "date" : ISODate("2014-03-01T09:00:00Z") } 
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "weight" : 2, "date" : ISODate("2014-03-15T09:00:00Z") } 
{ "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "weight" : 3, "date" : ISODate("2014-04-04T11:21:39.736Z") } 
{ "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "weight" : 3, "date" : ISODate("2014-04-04T21:23:13.331Z") } 

彙總數據時使用平均$代替,要使用加權平均(https://support.microsoft.com/en-ca/help/214049/how-to-calculate-weighted-averages-in-excel)。如果原生支持,它可能看起來像:

db.sales.aggregate(
    [ 
     { 
     $group : { 
      _id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } }, 
      totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } }, 
      averageQuantity: { $weighted_avg: { $value : "$quantity", $weight: "$weight" }, 
      count: { $sum: 1 } 
     } 
     } 
    ] 
) 

的想法是,當你進行平均的,您同時擁有平均和重量。 Mongo支持加權平均數,因爲它支持按照How do I calculate a weighted average in mongoDB using aggregation framework?乘法和除法的數學運算。但我無法弄清楚的是,如何在彙總數據時使用加權平均值。當我想要使用$組時,如何應用How do I calculate a weighted average in mongoDB using aggregation framework?的答案。這個答案的問題在於它是一個$組和一個$項目,你似乎無法將它用作$組的累加器。

+0

考慮到的問題是你有語法不正確完全,那麼「子集」是真的不來形容你的問題的最好辦法。相反,您應該提供一些源數據,您的預期結果以及如何獲得這些結果的說明。你不能在'$ group'中嵌套'$ group',所以不是「嘗試的一部分」而是顯示需要發生的事情。 –

回答

0

所以我有一個解決我的問題。我試圖一次做得太多。我的解決方案是將分組和項目分解爲兩個獨立的步驟,同時將分子和分母設置爲臨時值並且工作。

{ 
    "$group":{ 
     "_id":{ 
     "id:DIM_1":"$id:DIM_1", 
     "id:DIM_2":"$id:DIM_2" 
     }, 
     "id:WAVG_A??num":{ 
     "$sum":{ 
      "$multiply":[ 
       "$id:WAVG_A", 
       "$id:MET_A" 
      ] 
     } 
     }, 
     "id:WAVG_A??den":{ 
     "$sum":"$id:MET_A" 
     }, 
     "id:MET_A":{ 
     "$sum":"$id:MET_A" 
     } 
    } 
} 

然後

{ 
    "$project":{ 
     "id:DIM_1":"$_id.id:DIM_1", 
     "id:DIM_2":"$_id.id:DIM_2", 
     "id:WAVG_A":{ 
     "$cond":[ 
      { 
       "$eq":[ 
        "$id:WAVG_A??den", 
        0 
       ] 
      }, 
      0, 
      { 
       "$divide":[ 
        "$id:WAVG_A??num", 
        "$id:WAVG_A??den" 
       ] 
      } 
     ] 
     }, 
     "id:MET_A":"$id:MET_A" 
    } 
+0

我也提交了一個功能請求,將加權平均值作爲累加器添加到Mongo中。 https://jira.mongodb.org/browse/SERVER-31594?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel –