使用$eq运算符时,无法引用case语句中的MongoDB文档字段

使用$eq运算符时,无法引用case语句中的MongoDB文档字段,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我的MongoDB版本是3.6.3 我的收藏的一个例子: /*A snippet of my collection*/ /* 1 */ { "_id" : ObjectId("5a81a0de19a4ea2a8b119baa"), "Site" : 123, "Event" : "AnEvent", "SubEvent" : "MoreDetails", "Level" : 2 } /* 2 */ { "_id" : ObjectId("5a81

我的MongoDB版本是3.6.3

我的收藏的一个例子:

/*A snippet of my collection*/
/* 1 */
{
    "_id" : ObjectId("5a81a0de19a4ea2a8b119baa"),
    "Site" : 123,
    "Event" : "AnEvent",
    "SubEvent" : "MoreDetails",
    "Level" : 2
}

/* 2 */
{
    "_id" : ObjectId("5a81a0de19a4ea2a8b119bab"),
    "Site" : 456,
    "Event" : "TheEvent",
    "SubEvent" : "FurtherDetails",
    "Level" : 3
}

/* 3 */
{
    "_id" : ObjectId("5a81a0de19a4ea2a8b119bac"),
    "Site" : 789,
    "Event" : "WorldEndingEvent",
    "SubEvent" : "RelevantDetails",
    "Level" : 5
}
我正在尝试输出以下文档(根据事件和子事件字段有条件地添加新字段):

为了实现这一点,我使用MongoDB提供的switch case构造(但没有成功):

这不起作用,因为MongoDB无法识别$Event

但是,如果我使用类似的方法(基于开关情况的投影),但使用$gt(和类似的)操作符,那么MongoDB在识别$Event时不会有任何问题

/*This works. Mongo recognizes $Event now, inside the case statement*/
db.getCollection('Error_events_aggregated').aggregate([
    {
        $project: {
            Site: 1,
            Event: 1,
            SubEvent: 1,
            Level: 1,
            NewLevel: {
                $switch: {
                    branches: [
                        {
                            case: {$gt: ["$Event", "V"]}, /*Matches WorldEndingEvent*/
                            then: 4 
                        },
                        {
                            case: {$gt: ["$Event", "S"]}, /*Matches TheEvent*/
                            then: 2
                        },
                        {
                            case: {$gt: ["$Event", "Am"]}, /*Matches AnEvent*/
                            then: 1
                        }
                    ],
                    default: "$Level"
                    }
                }
            }
        }
])
有人能帮我找出我做错了什么吗?我试着通读这些文档,但所有与$switch和$cond相关的示例都只涉及$gt和类似的运算符,不涉及基于等式的操作

我也尝试过使用{:}语法检查相等性,但没有效果。

您可以使用而不是
$project
。另外,
$switch
$eq
的语法在这里也有很大不同,请尝试:

db.col.aggregate([
    {
        $addFields: {
            NewLevel: {
                $switch: {
                    branches: [
                        {
                            case: {
                                $and: [
                                    { $eq: [ "$Event", "AnEvent" ] },
                                    { $eq: [ "$SubEvent", "MoreDetails" ] }
                                ] 
                            },
                            then: 1
                        },
                        {
                            case: {
                                $and: [
                                    { $eq: [ "$Event", "TheEvent" ] },
                                    { $eq: [ "$SubEvent", "FurtherDetails" ] }
                                ] 
                            },
                            then: 2
                        },
                        {
                            case: {
                                $and: [
                                    { $eq: [ "$Event", "WorldEndingEvent" ] },
                                    { $eq: [ "$SubEvent", "RelevantDetails" ] }
                                ] 
                            },
                            then: 4
                        }
                    ],
                    default: "$Level"
                }
            }
        }
    }
])
您可以使用而不是
$project
。另外,
$switch
$eq
的语法在这里也有很大不同,请尝试:

db.col.aggregate([
    {
        $addFields: {
            NewLevel: {
                $switch: {
                    branches: [
                        {
                            case: {
                                $and: [
                                    { $eq: [ "$Event", "AnEvent" ] },
                                    { $eq: [ "$SubEvent", "MoreDetails" ] }
                                ] 
                            },
                            then: 1
                        },
                        {
                            case: {
                                $and: [
                                    { $eq: [ "$Event", "TheEvent" ] },
                                    { $eq: [ "$SubEvent", "FurtherDetails" ] }
                                ] 
                            },
                            then: 2
                        },
                        {
                            case: {
                                $and: [
                                    { $eq: [ "$Event", "WorldEndingEvent" ] },
                                    { $eq: [ "$SubEvent", "RelevantDetails" ] }
                                ] 
                            },
                            then: 4
                        }
                    ],
                    default: "$Level"
                }
            }
        }
    }
])

mongoDB中的Switch语句基本上计算一系列case表达式,因此case语句中包含的任何内容都应该是表达式,而不仅仅是变量名。是的,我们可以使用$eq(mongoDB中的Equal运算符)而不是$gt

db.getCollection('Error_events_aggregated').aggregate([
{
    $project: {
        Site: 1,
        Event: 1,
        SubEvent: 1,
        Level: 1,
        NewLevel: {
            $switch: {
                branches: [
                    {
                        case: {$eq: ["$Event", "WorldEndingEvent"]}, /*Matches WorldEndingEvent*/
                        then: 4 
                    },
                    {
                        case: {$eq: ["$Event", "TheEvent"]}, /*Matches TheEvent*/
                        then: 2
                    },
                    {
                        case: {$eq: ["$Event", "AnEvent"]}, /*Matches AnEvent*/
                        then: 1
                    }
                ],
                default: "$Level"
                }
            }
        }
    }
])

请让我知道这是否正常工作,以及是否需要进行任何其他更改。

mongoDB中的Switch语句基本上计算一系列case表达式,因此case语句中包含的任何内容都应该是一个表达式,而不仅仅是一个变量名。是的,我们可以使用$eq(mongoDB中的相等运算符)而不是$gt

db.getCollection('Error_events_aggregated').aggregate([
{
    $project: {
        Site: 1,
        Event: 1,
        SubEvent: 1,
        Level: 1,
        NewLevel: {
            $switch: {
                branches: [
                    {
                        case: {$eq: ["$Event", "WorldEndingEvent"]}, /*Matches WorldEndingEvent*/
                        then: 4 
                    },
                    {
                        case: {$eq: ["$Event", "TheEvent"]}, /*Matches TheEvent*/
                        then: 2
                    },
                    {
                        case: {$eq: ["$Event", "AnEvent"]}, /*Matches AnEvent*/
                        then: 1
                    }
                ],
                default: "$Level"
                }
            }
        }
    }
])

请让我知道这是否工作正常,以及是否有任何其他更改需要进行。

太棒了!成功了。万分感谢!:)我想知道为什么在文档中找不到替代语法。。。可能在那里,但不是在一个容易找到的地方引用。太棒了!成功了。万分感谢!:)我想知道为什么在文档中找不到替代语法。。。可能在那里,但不在容易找到的地方引用。