使用$eq运算符时,无法引用case语句中的MongoDB文档字段
我的MongoDB版本是3.6.3 我的收藏的一个例子:使用$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
/*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"
}
}
}
}
])
请让我知道这是否工作正常,以及是否有任何其他更改需要进行。太棒了!成功了。万分感谢!:)我想知道为什么在文档中找不到替代语法。。。可能在那里,但不是在一个容易找到的地方引用。太棒了!成功了。万分感谢!:)我想知道为什么在文档中找不到替代语法。。。可能在那里,但不在容易找到的地方引用。