2016-05-31 38 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 
} 
相关问题