我正在尝试在Mongo中执行一个简单的切换案例,但不断收到语法错误消息
db.users.aggregate([
{ $project: {
"age": 1,
"Age Group":{
$switch:{
branches:[
{
case: {$lte:[{"age": "18"}]},
then: "Minor"
},
{
case: {$gt:[{"age": "18"}]},
{$lte:[{"age": "30"}]},
then: "Young Adult"
}
],
default: "No Age Group"
}
}
}}
])
有人可以帮忙吗?
答案 0 :(得分:1)
如果您实际拥有MongoDB 3.2,则需要$and
来满足多种条件:
db.users.aggregate([
{ "$project": {
"age": 1,
"Age Group": {
"$switch": {
"branches": [
{
"case": { "$lte": ["$age", "18"] },
"then": "Minor"
},
// This one <----
{
"case": {
"$and": [
{ "$gt": ["$age", "18"] },
{ "$lte": ["$age", "30"] }
]
},
"then": "Young Adult"
}
],
"default": "No Age Group"
}
}
}}
])
实际上,分支实际工作的方式不需要两个条件,因为&#34;第一个分支&#34;将以下分支短路:
db.users.aggregate([
{ "$project": {
"age": 1,
"Age Group": {
"$switch": {
"branches": [
{
"case": { "$lte": ["$age", "18"] },
"then": "Minor"
},
// Just needs the $lte condition
{
"case": { "$lte": ["$age", "30"] },
"then": "Young Adult"
}
],
"default": "No Age Group"
}
}
}}
])
最重要的是,$gt
和$lte
逻辑运算符采用&#34;数组&#34;作为一个论点,而不是一个&#34;对象&#34;当你试图使用它们时。这与&#34;查询&#34;不同。运营商表格。
注意:您还需要表示&#34;字段值&#34;使用
$
,否则它只是&#34;字符串&#34;。当然,age
的值也是字符串,因此"9"
实际上不是&#34;小于&#34;"18"
。您可能应修复数据以将其存储为数值。
如果您实际上没有MongoDB 3.2,那么这实际上总是可以通过$cond
实现,但只需要更长的语法:
db.users.aggregate([
{ "$project": {
"age": 1,
"Age Group": {
"$cond": {
"if": { "$lte": ["$age", "18" ] },
"then": "Minor",
"else": {
"if": { "$lte": ["$age", "30"] },
"then": "Young Adult",
"else": "No Age Group"
}
}
}
}}
])
所以&#34;嵌套&#34;的形式$cond
基本上是$switch
以不同的语法形式执行的操作,没有&#34;嵌套&#34;。但是只要聚合框架已经存在$cond
,所以你总能做到这一点。