sql >> Database teknologi >  >> NoSQL >> MongoDB

Er der en anden ting i MongoDB til $cond under aggregering

Med moderne udgivelser (siden MongoDB 3.4) ville du bruge $switch , som dybest set er modstykket til switch eller case søgeord i andre sprogimplementeringer:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$switch": {
        "branches": [
          { "case": { "$eq": [ "$field1", "4" ] }, "then": 30 },
          { "case": { "$eq": [ "$field1", "8" ] }, "then": 25 }
        ],
        "default": 10
      }
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
])

Dette undgår indlejring hvis..så..else betingelser, som kan gøres ved hjælp af $cond og vist nedenfor. Men nedenstående viser stadig som et eksempel, at dette altid kunne gøres, selv før den nye operatør af selv den eksplicitte if..then..else søgeord, da den oprindelige array-notation altid bibeholdt denne syntaks.

Bemærk også, at en array af betingelser her er typisk også meget nemmere at konstruere programmatisk end at skabe en indlejret datastruktur for erklæringen som var nødvendig med $cond .

if..then..else søgeord til $cond operatør er kun en nylig tilføjelse fra nyere versioner af MongoDB i skrivende stund ( MongoDB 2.6 var introduktionen af ​​søgeordene . Den faktiske operatør var tilgængelig med frigivelse af aggregeringsrammerne i MongoDB 2.2). Hensigten var for klarhed, men i dette tilfælde ser det ud til, at det har skabt en vis forvirring.

Som en if..then.else operatør $cond er faktisk en ternær operatør, ligesom det ville blive implementeret i mange programmeringssprog. Dette betyder som en "inline" betinget, snarere end at skabe "blokke" af logik til betingelserne, alt, der ikke opfylder den første betingelse, hører under else .

Derfor "indlejrer" du udsagn i stedet for at følge blokke:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$cond": { 
        "if": { "$eq": [ "$field1", "4" ] }, 
        "then": 30,
        "else": {
          "$cond": {
            "if": { "$eq": ["$field1","8"]}, 
            "then": 25, 
            "else": 10
          }
        }
      }
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
]);

Eller endda med det originale array notation, som nogle måske foretrækker, hvis de bygger sætningen programmatisk:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$cond": [
         { "$eq": [ "$field1", "4" ] }, 
         30,
         { "$cond": [
           { "$eq": ["$field1","8"] },
           25, 
           10
         ]}
      ]
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
]);

Ternær betyder tre betingelser, hverken mere eller mindre. Så alle hvis..så..else logik skal være indlejret.



  1. Hvad er en bedre tilgang til at gemme og forespørge på et stort datasæt af meteorologiske data

  2. Importerer et meget stort rekordsæt til MongoDB ved hjælp af nodejs

  3. Hvordan virker SignalR.Redis under motorhjelmen?

  4. Mongodb findOneAndUpdate-funktionen indsætter nyt dokument