$ sum与多个条件

时间:2014-07-31 14:22:58

标签: mongodb mongodb-query aggregation-framework

我需要使用$ sum转换当前$ group以添加另一个条件:

  

如果$ eq返回true,实际上对一个字段求​​和。

现在,如果$ eq返回true并且$ exists返回true,我想对一个字段求​​和。

我现在的小组是这样的:

"techsWorkQty": {
                "$sum": {
                    "$cond": [
                        { "$eq": [
                            "$works.TechnicianId", id
                        ]},
                        1,
                        0
                    ]
                }
            }

我在哪里可以添加以下子查询?

{
 $works.percent:{$exists:true}
}

3 个答案:

答案 0 :(得分:1)

$exists运算符是"查询"仅限运算符,并且只能在$match管道中用于聚合。为了测试现场存在作为一个逻辑"您想要使用$ifNull的运算符。 $and运算符用于组合逻辑条件,也是一个逻辑运算符,而不是同名的查询形式。逻辑运算符可以在$project$group阶段使用:

"techsWorkQty": {
    "$sum": {
        "$cond": [
            { "$and": [
                { "$ifNull": [ "$works.percent", false ] },
                { "$eq": [ "$works.TechnicianId", id ] }
            ]},
            1,
            0
        ]
    }
}

$ifNull返回其存在的字段值或字段不存在时指定的备用值。在这种情况下,"值"对于当前字段,将在布尔上下文中评估为true。如果没有字段,则返回false参数。布尔形式的$and要求两个逻辑表达式都计算为true,否则它本身会返回false,它由包装$cond处理以返回适当的值。

答案 1 :(得分:1)

Project.aggregate([
{
            "$unwind": "$works"
        },
$group: {
_id:null,
techsWorkQty: {
                $sum: {
                    $cond: {
                        if: {
                            $eq: ['$works.percent', id]
                        },
                        then: 1,
                        else: 0
                    }
                }
            }
      }
])

答案 2 :(得分:0)

您可以使用$and运算符包含必须满足的多个条件。你可以尝试这样的事情:

"techsWorkQty": {
                "$sum": {
                    "$cond": [
                        { "$and" : [
                               {"$works.percent":{$exists:true}}, 
                               {"$eq": ["$works.TechnicianId", id]}
                           ]
                        },
                        1,
                        0
                    ]
                }
            }