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

MongoDB $превключвател

В MongoDB, $switch Операторът на конвейера за агрегиране оценява серия от case изрази и изпълнява определен израз само когато case изразът се оценява на true .

Синтаксис

Синтаксисът е така:

$switch: {
   branches: [
      { case: <expression>, then: <expression> },
      { case: <expression>, then: <expression> },
      ...
   ],
   default: <expression>
}

Пример

Да предположим, че имаме колекция, наречена pets със следните документи:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }

Можем да използваме $switch оператор за изпълнение на някои изрази за регистри спрямо weight поле:

db.pets.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          weight: 1,
          result: {
            $switch: {
              branches: [
                  { case: { $gt: [ "$weight", 100 ]  }, then: "Heavy" },
                  { case: { $lt: [ "$weight", 20 ]  }, then: "Light" }
              ],
              default: "Medium"
            }
          }
        }
    }
  ]
)

Резултат:

{ "weight" : 20, "result" : "Medium" }
{ "weight" : 10, "result" : "Light" }
{ "weight" : 7, "result" : "Light" }
{ "weight" : 8, "result" : "Light" }
{ "weight" : 100, "result" : "Medium" }
{ "weight" : 130, "result" : "Heavy" }
{ "weight" : 200, "result" : "Heavy" }
{ "weight" : 12, "result" : "Light" }
{ "weight" : 30, "result" : "Medium" }

Пропускане на израза по подразбиране

Пропускане на default от кода може да доведе до грешка. Но това зависи от резултата от case изрази.

Ако премахнем default част от горния пример, получаваме грешка:

db.pets.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          weight: 1,
          result: {
            $switch: {
              branches: [
                  { case: { $gt: [ "$weight", 100 ]  }, then: "Heavy" },
                  { case: { $lt: [ "$weight", 20 ]  }, then: "Light" }
              ]
            }
          }
        }
    }
  ]
)

Резултат:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$switch could not find a matching branch for an input, and no default was specified.",
	"code" : 40066,
	"codeName" : "Location40066"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

В този случай имаше входни стойности, които не бяха обхванати от case изрази (т.е. тези между 20 и 100) и така $switch върна грешка.

Въпреки това, ако променим case изрази, можем да премахнем default част без грешка:

db.pets.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          weight: 1,
          result: {
            $switch: {
              branches: [
                  { case: { $gt: [ "$weight", 100 ]  }, then: "Heavy" },
                  { case: { $lte: [ "$weight", 100 ]  }, then: "Light" }
              ]
            }
          }
        }
    }
  ]
)

Резултат:

{ "weight" : 20, "result" : "Light" }
{ "weight" : 10, "result" : "Light" }
{ "weight" : 7, "result" : "Light" }
{ "weight" : 8, "result" : "Light" }
{ "weight" : 100, "result" : "Light" }
{ "weight" : 130, "result" : "Heavy" }
{ "weight" : 200, "result" : "Heavy" }
{ "weight" : 12, "result" : "Light" }
{ "weight" : 30, "result" : "Light" }

В този пример всички документи отговарят на всички case изрази и така default не беше необходимо – което означаваше, че не е допусната грешка.

Документация на MongoDB

Вижте документацията на MongoDB за повече подробности и примери.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Най-добрата практика на MongoDB за препращане

  2. MongoDB $lt Оператор на конвейер за агрегиране

  3. Използване на AngularJs и MongoDB/Mongoose

  4. $unwind празен масив

  5. Mongodb Запитване За избор на записи с даден ключ