【问题标题】:mongoose aggregate using $exists in $condmongoose 使用 $cond 中的 $exists 聚合
【发布时间】:2017-05-23 09:40:12
【问题描述】:

如果一个字段存在,我想$project,但不是它的值,使用mongoosemodelaggregate查询。 如果可以在$cond 中使用$exists,它应该是这样的:

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

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

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

它产生了预期的结果,但由于某种原因,mongoose 模型aggregate 总是产生true

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

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

我需要以下结果:

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

我怎样才能用mongoose 做类似的事情?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    $existsMongoDBaggregate 查询中不受支持。所以在aggregate查询而不是$exists可以使用$ifNull

    语法:

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

    for more

    更新:

    要获得b 值作为truefalse 可以试试这个查询

    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
    if condition = false then return else result 表示b = false

    【讨论】:

    • 我不能使用$ifNull,因为我不想投影该字段的值,只要它存在与否。如果$ifNull返回false,它将投影该值。
    • 实际上你的目标是什么你可以在你的问题部分添加一个例子更清楚@TomG
    • 我加了一个例子
    • 很高兴听到这个消息:)
    • @DaNLtR 我已经添加了一个解释,所以你现在可以清楚了
    【解决方案2】:

    您可以在这种情况下使用两个$project 语句并使用$ifNull 运算符(当some_field 设置为false 时将不起作用,在这种情况下,您可以将内部false 更改为更合适)

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

    【讨论】:

    • 是的,这是一个选项,但我不想添加额外的$project 阶段,这不是我使用的唯一字段和条件。
    猜你喜欢
    • 2020-06-21
    • 2017-10-12
    • 2023-03-17
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2016-11-01
    相关资源
    最近更新 更多