sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Hay algo más en MongoDB para $cond mientras se agrega?

Con versiones modernas (desde MongoDB 3.4), usaría $switch , que es básicamente la contraparte de switch o case palabras clave en implementaciones de otros idiomas:

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

Esto evita anidamiento el if..then..else condiciones como se puede hacer usando $cond y se muestra a continuación. Pero lo siguiente todavía muestra como un ejemplo que esto siempre se puede hacer, incluso antes del nuevo operador de incluso el explícito if..then..else palabras clave ya que la notación de matriz original siempre mantuvo esa sintaxis.

Observando también que una matriz de condiciones aquí también es mucho más fácil de construir programáticamente que crear un anidado estructura de datos para la declaración como se necesitaba con $cond .

El if..then..else palabras clave al $cond operador son solo una adición reciente a partir de versiones recientes de MongoDB en el momento de escribir este artículo (MongoDB 2.6 fue la introducción de las palabras clave . El operador real estaba disponible con el lanzamiento del marco de agregación en MongoDB 2.2). La intención era aclarar, pero en este caso parece haber causado cierta confusión.

Como if..then.else operador $cond es de hecho un ternary operador, tal como se implementaría en muchos lenguajes de programación. Esto significa que como condicional "en línea", en lugar de crear "bloques" de lógica para las condiciones, cualquier cosa que no cumpla con la primera condición pertenece a else .

Por lo tanto, "anida" las declaraciones en lugar de seguir los bloques:

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

O incluso con la matriz original notación, que algunos podrían preferir si construyen la declaración programáticamente:

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

Ternario significa tres condiciones, ni más ni menos. Entonces todo if..then..else la lógica debe estar anidada.