2016-05-31 74 views
3

我在MongoDB 3.2上運行了一些聚合查詢。 我想按另一個數字字段的平均字段對文檔進行分組。 我需要平均值來忽略0值。 問題是我不能完全過濾文檔,因爲有一個我需要一個計數的另一個字段。

讓我們舉例說明:

這是我的文檔的結構:

{"stringToGroupByOn":"foo", "valueToAvg":42, "valueToSum":21} 
{"stringToGroupByOn":"foo", "valueToAvg":0, "valueToSum":13} 

我不能只是篩選是這樣的:

db.foobar.aggregate([ 
    { 
     $match : { valueToAvg : { $gt : 0 } } 
    }, 
    { 
     $group : { 
      _id : '$stringToGroupByOn', 
      avg : { $avg : '$valueToAvg' }, 
      count : { $sum : '$valueToSum' } 
     } 
    } 
]) 

因爲我失去了價值13對計數。

您是否認爲只有一種查詢方式才能做到這一點?

+0

什麼MONGO版本中,我們有嗎? – profesor79

+0

對不起,我忘了提及它:版本3.2 – eli0tt

回答

2

您可以在投影中使用$ cond來設置空值而不是0,因爲在使用平均值時不考慮空值。

db.avg.aggregate([ 
    {$project:{ 
     _id:1, 
     valueToSum:1, 
     stringToGroupByOn:1, 
     valueToAvg:{$cond: 
      { if: { $eq: [ "$valueToAvg", 0 ] }, 
        then: null, 
        else: "$valueToAvg" }}   
     }}, 
    { 
     $group : { 
      _id : '$stringToGroupByOn', 
      avg : { $avg : '$valueToAvg' }, 
      count : { $sum : '$valueToSum' } 
     } 
    } 

輸出:

{ 
    "_id" : "foo", 
    "avg" : 42.0, 
    "count" : 34.0 
} 
相關問題