Avec les versions modernes (depuis MongoDB 3.4), vous utiliseriez $switch
, qui est essentiellement l'équivalent de switch
ou case
mots-clés dans d'autres implémentations de langage :
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 }
])
Cela évite l'imbrication le if..then..else
conditions comme cela peut être fait en utilisant $cond
et illustré ci-dessous. Mais ce qui suit montre toujours à titre d'exemple que cela pourrait toujours être fait, même avant le nouvel opérateur même de l'explicite if..then..else
mots-clés puisque la notation de tableau d'origine a toujours conservé cette syntaxe.
Notant également qu'un tableau des conditions ici est généralement aussi beaucoup plus facile à construire par programmation que de créer un imbriqué structure de données pour la déclaration comme cela était nécessaire avec $cond
.
Le if..then..else
mots-clés au $cond
L'opérateur n'est qu'un ajout récent à partir des versions récentes de MongoDB au moment de la rédaction (MongoDB 2.6 était l'introduction des mots clés . L'opérateur réel était disponible avec la publication du cadre d'agrégation dans MongoDB 2.2). L'intention était de clarifier, mais dans ce cas, cela semble avoir causé une certaine confusion.
En tant que if..then.else
opérateur $cond
est bien un ternaire
opérateur, tout comme cela serait implémenté dans de nombreux langages de programmation. Cela signifie qu'en tant que condition "en ligne", plutôt que de créer des "blocs" de logique pour les conditions, tout ce qui ne remplit pas la première condition appartient à else
.
Par conséquent, vous "imbriquez" les instructions plutôt que de suivre les blocs :
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 }
]);
Ou même avec le tableau d'origine notation, que certains pourraient préférer s'ils construisaient l'instruction par programme :
db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": [
{ "$eq": [ "$field1", "4" ] },
30,
{ "$cond": [
{ "$eq": ["$field1","8"] },
25,
10
]}
]
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);
Ternaire signifie trois conditions, ni plus ni moins. Donc tout if..then..else
la logique doit être imbriquée.