2017-10-13 57 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 –