sql >> Databáze >  >> NoSQL >> MongoDB

Existuje v MongoDB něco jiného než $cond při agregaci

S moderními verzemi (od MongoDB 3.4) byste použili $switch , což je v podstatě protějšek k přepínač nebo case klíčová slova v jiných jazykových implementacích:

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

Vyhnete se tak vnoření if..then..else podmínek, které lze provést pomocí $cond a zobrazeno níže. Níže však stále ukazuje jako příklad, že to lze provést vždy, dokonce i před novým operátorem, dokonce i explicitním if..then..else klíčová slova, protože původní zápis pole vždy zachovával tuto syntaxi.

Všimněte si také, že pole podmínek je zde obvykle také mnohem jednodušší vytvořit programově než vytvořit vnořený datová struktura pro výpis, jak bylo potřeba s $cond .

if..then..else klíčová slova do $cond operátor jsou v době psaní tohoto článku pouze nedávným přírůstkem do posledních verzí MongoDB ( MongoDB 2.6 bylo zavedení klíčových slov . Skutečný operátor byl k dispozici s vydáním agregačního rámce v MongoDB 2.2). Záměrem bylo srozumitelnost, ale v tomto případě se zdá, že to způsobilo určitý zmatek.

Jako if..then.else operátor $cond je skutečně ternární operátor, stejně jako by to bylo implementováno v mnoha programovacích jazycích. To znamená, že jako „inline“ podmínka, spíše než vytváření „bloků“ logiky podmínek, vše, co nesplňuje první podmínku, patří pod else .

Proto příkazy "vnořujete" spíše než následujete bloky:

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

Nebo dokonce s původní polí notace, kterou by někteří mohli preferovat, pokud sestavují příkaz programově:

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

Ternární znamená tři podmínky, nic více, nic méně. Takže vše if..then..else logika musí být vnořená.



  1. Vytvoření nové sady z řady Sorted Set v Redis

  2. Jak načíst data ze sbírky MongoDB v C# pomocí regulárního výrazu?

  3. Jak získat zpět původní dokument po agregaci

  4. Ve Flasku převeďte objekt POST z formuláře na reprezentaci vhodnou pro mongodb