Vorausgesetzt, Sie haben tatsächlich MongoDB 3.2, benötigen Sie einen $and
für mehrere Bedingungen:
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"
}
}
}}
])
Tatsächlich aber die Art und Weise der Verzweigung Sie tatsächlich funktioniert nicht brauchen zwei Bedingungen, da die „erste Zweig“ short -Schaltungen die folgenden Zweige:
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"
}
}
}}
])
Am wichtigsten ist die $gt
und $lte
logischen Operatoren „Arrays“ als Argument, und nicht ein „Objekt“, wie Sie sie zu nutzen versucht. Dies unterscheidet sich vom Operatorformular "Abfrage".
Hinweis: Sie müssen auch „Feldwerte“ mit $
bezeichnen, ansonsten ist es nur ein „string“. Und natürlich sind die Werte von age
auch Strings, also ist "9"
nicht wirklich "weniger als" "18"
. Sie sollten wahrscheinlich Ihre Daten reparieren, um diese als numerische Werte zu speichern.
Wenn Sie eigentlich nicht MongoDB 3.2 haben, dann war dies eigentlich immer erreichbar über $cond
, aber nur ein wenig länger in der Syntax:
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"
}
}
}
}}
])
Damit Form von „verschachtelten“ $cond
ist im Grunde was $switch
in einer anderen Syntaxform macht, ohne die "Verschachtelung". Aber gibt es schon so lange, wie das Aggregationsframework gewesen ist, also könnten Sie das immer tun.