根据字段的存在与否,在投影管道中实现mongo $ cond字段

时间:2016-04-28 12:01:50

标签: mongodb mongodb-query aggregation-framework

我试图在mongo管道中执行以下操作 -

{ $project: { 
    newAttribute: { 
        $cond: [
            { $exists: { '$myAttribute': true } }, 
            1, 
            0
        ]
    }
}}

然而,这会引发错误 -

    Error: command failed: {
    "errmsg" : "exception: invalid operator '$exists'",
    "code" : 15999,
    "ok" : 0
}

我可以看到有人试图做类似的事情here,但$ifNull对我没有帮助,因为我希望值为1,而不是myAttribute字段的值

有解决这个问题的好方法吗?

1 个答案:

答案 0 :(得分:3)

如果您的MongoDB服务器版本是3.2或更高版本,您可以使用$allElementsTrue$anyElementTrue

db.collection.aggregate([
    { "$project": { 
        "newAttribute": { 
            "$cond": [
                { "$anyElementTrue": [ [ "$myAttribute" ] ] }, 
                1, 
                0
            ]
        }
    }}
])

从MongoDB版本< = 3.0,您始终可以依赖$ifNull运算符来检查该字段是否存在,然后使用$cond运算符相应地设置值。

db.collection.aggregate([
    { "$project": { 
        "newAttribute": { 
            "$cond": [ 
                { "$eq": [ 
                    { "$ifNull": [ "$myAttribute", 99999 ] }, 
                    99999
                ]}, 
                0, 
                1
            ]
        }
    }}
])