1

Ich versuche, einen einfachen Schalter Fall in Mongo zu tun, aber halten Nachrichten Syntaxfehler immerAggregate Schaltergehäuse Syntax mit mehreren Bedingungen

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" 
     } 
    } 
    }}   
]) 

Kann mir jemand bitte helfen?

Antwort

1

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.