只要你确实有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"
}
}
}}
])
其实不然,虽然,实际上分支工作,你并不需要两个条件,因为“第一支”短的方式-circuits如下分支:
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
逻辑运算符,你试图使用他们采取“阵列”作为参数,而不是一个“对象”。这与“查询”操作符表单不同。
注:还需要表示“字段值”与$
,否则它只是一个“串”。当然age
的值也是字符串,所以"9"
实际上并不是“小于”"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"
}
}
}
}}
])
那么的“嵌套”这种形式$cond
基本上是什么$switch
用不同的语法形式,没有“嵌套”。但是$cond
只要聚合框架一直存在,所以你总是可以做到这一点。