使用$的mongoose聚合在$ cond中存在

时间:2017-01-09 07:11:18

标签: node.js mongodb mongoose

我想$project如果某个字段存在,但不是它的值,使用mongoose model aggregate查询。 如果可以在$exists中使用$cond,则看起来像这样:

$project: {
    b: {
        $cond: {
            if    : {$exists: ['$b', true]},
            then  : true,
            else  : false
        }
    }
}

但是,我必须在boolean运算符中使用$cond表达式。 在MongoDB shell中,我可以做类似的事情:

{$eq: ['$b', undefined]}

并且它会产生预期的结果,但由于某种原因,mongoose模型aggregate会产生true

例如,如果我有以下文件:

{
    "a" : 1,
    "b" : 2
},
{
    "a" : 1
}

我需要以下结果:

{
    "b": true
},
{
    "b": false
}

如何使用mongoose做出类似的事情?

2 个答案:

答案 0 :(得分:6)

MongoDB $exists查询不支持

aggregate。因此,在aggregate查询中,而不是$exists可以使用$ifNull

语法:

{ $ifNull: [ <expression>, <replacement-expression-if-null> ] }

for more

<强>更新

获取btruefalse可以尝试此查询

db.test.aggregate([
    {
        $project: {
            b: { 
                $cond: [
                    {$ifNull: ['$b', false]}, // if
                    true, // then
                    false // else
                ]
            }
        }
    }
])

<强>解释

b = $cond: [ 'if condition satisfied', 'then true', 'else false' ];

其中condition = {$ifNull: ['$b', false]}  如果$b不存在,则condition = false另有condition = true

所以如果condition = true然后返回,那么结果就意味着b = true
如果condition = false则返回其他结果表示b = false

答案 1 :(得分:0)

您可以针对此案例使用两个$project语句,并使用$ifNull运算符(some_field设置为false时无法正常工作,在这种情况下,您可以将内部false更改为更合适的内容

[
{
        $project: {
        test: {
            $ifNull: [
                '$some_field',
                false
            ]
        }
    }
},
{
    $project: {
        test: {
            $cond: {
                if    : {$eq: ['$test', false]},
                then  : false,
                else  : true
            }
        }
    }
}

])