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.