2016-05-31 3 views
3

MongoDB 3.2でいくつかの集約クエリを実行します。 別の数値フィールドに平均値を持つフィールドでドキュメントをグループ化したいと思います。 0値を無視するには平均値が必要です。 問題は、私は完全に文書をフィルタリングできないため、カウントに必要な別のフィールドがあるためです。

さんが説明してみましょう:私は値13を失うので

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

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

私はちょうどこのようにフィルタリングすることはできません。

これは私の文書の構造でありますカウント。

あなたは1つのクエリでそれを行う方法があると思いませんか?

+0

? – profesor79

+0

申し訳ありませんが、私はそれを言い忘れました:バージョン3.2 – eli0tt

答えて

2

プロジェクションで$ condを使用すると、平均を使用するときにnullが考慮されないため、0の代わりにnullを設定できます。

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' } 
     } 
    } 

出力:私たちが持っているもののmongoバージョン

{ 
    "_id" : "foo", 
    "avg" : 42.0, 
    "count" : 34.0 
} 
関連する問題