【问题标题】:Exclude 0 values from mongodb $avg but keeping other fields从 mongodb $avg 中排除 0 值但保留其他字段
【发布时间】:2016-05-31 15:45:48
【问题描述】:

我在 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。

你认为有一种方法可以只在一个查询中完成吗?

【问题讨论】:

  • 我们有什么 mongo 版本?
  • 抱歉我忘了说:3.2版

标签: mongodb aggregation-framework


【解决方案1】:

您可以在投影中使用 $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' }
        }
    }

输出:

{
    "_id" : "foo",
    "avg" : 42.0,
    "count" : 34.0
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多