MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Има ли нещо elseif в MongoDB за $cond по време на агрегиране

С модерни версии (от MongoDB 3.4) ще използвате $switch , което по същество е противоположно на switch или case ключови думи в други езикови реализации:

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

Това избягва влагането if..then..else условия, както може да се направи с помощта на $cond и показано по-долу. Но по-долу все още показва като пример, че това винаги може да се направи, дори преди новия оператор дори на изричния if..then..else ключови думи, тъй като оригиналната нотация на масива винаги поддържаше този синтаксис.

Отбелязвайки също, че масив от условия тук обикновено също е много по-лесно да се конструира програмно, отколкото създаването на вложено структура на данните за израза, както беше необходимо с $cond .

if..then..else ключови думи към $cond са само скорошна добавка към последните версии на MongoDB към момента на писане ( MongoDB 2.6 беше въвеждането на ключовите думи . Действителният оператор беше наличен с пускането на рамката за агрегиране в MongoDB 2.2). Намерението беше за яснота, но в този случай изглежда е предизвикало известно объркване.

Като if..then.else оператор $cond наистина е троичен оператор, точно както би бил приложен в много езици за програмиране. Това означава, че като „вградено“ условие, вместо да създава „блокове“ на логиката към условията, всичко, което не отговаря на първото условие, принадлежи към else .

Следователно вие „влагате“ изразите, вместо да следвате блокове:

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

Или дори с оригиналния масив нотация, която някои може да предпочетат, ако изграждат оператора програмно:

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

Тернарен означава три условия, нито повече, нито по-малко. Така че всички if..then..else логиката трябва да бъде вложена.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Качвайте файлове в DEFAULT_FILE_STORAGE вместо GridFs с mongoengine

  2. Съвкупност от различни подтипове в документ на колекция

  3. Mongo ObjectIDs:Безопасно ли е да се използва в дивата природа?

  4. Как да използвам C# за вмъкване на документ в съществуващи вградени документи?

  5. Мангуста, сортирайте заявката по попълнено поле