MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy w MongoDB jest coś innego do $cond podczas agregacji?

W nowoczesnych wydaniach (od MongoDB 3.4) użyjesz $switch , który jest zasadniczo odpowiednikiem switch lub przypadek słowa kluczowe w innych implementacjach językowych:

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

Pozwala to uniknąć zagnieżdżania if..then..else warunki, jak można to zrobić za pomocą $cond i pokazano poniżej. Ale poniżej nadal pokazuje jako przykład, że zawsze można to zrobić, nawet przed nowym operatorem nawet jawnym if..then..else słowa kluczowe, ponieważ oryginalna notacja tablicowa zawsze utrzymywała tę składnię.

Zauważając również, że tablica warunków tutaj jest zazwyczaj o wiele łatwiej skonstruować programowo niż tworzenie zagnieżdżonych struktura danych dla oświadczenia zgodnie z potrzebami $cond .

if..then..else słowa kluczowe do $cond Operatory są tylko ostatnim dodatkiem w ostatnich wersjach MongoDB w momencie pisania (MongoDB 2.6 było wprowadzeniem słów kluczowych . Rzeczywisty operator był dostępny wraz z wydaniem struktury agregacji w MongoDB 2.2 ). Intencją była przejrzystość, ale w tym przypadku wydaje się, że spowodowało to pewne zamieszanie.

Jako if..then.else operator $cond jest rzeczywiście trójargumentem operatora, tak jak byłoby to zaimplementowane w wielu językach programowania. Oznacza to, że jako warunek „wbudowany”, zamiast tworzenia „bloków” logiki do warunków, wszystko, co nie spełnia pierwszego warunku, należy do else .

Dlatego „zagnieżdżasz” instrukcje, a nie podążasz za blokami:

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

Lub nawet z oryginalną tablicą notacja, którą niektórzy mogą preferować przy programowym tworzeniu instrukcji:

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

Ternar oznacza trzy warunki, ni mniej, ni więcej. Więc wszystkie if..then..else logika musi być zagnieżdżona.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. jak mogę przepisać moje zapytanie z mangusty po podzieleniu danych z jednego modelu na dwa?

  2. Potrzebujesz porady, aby zaprojektować bazę danych w mongodb za pomocą mongoose

  3. 3 sposoby na usunięcie wartości z tablicy w MongoDB

  4. Mongoose - Wyszukaj tekst w trzech polach na podstawie wyniku lub wagi

  5. Węzeł nie łączy się z Mongo więcej niż raz