MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Appelez la fonction à l'intérieur de l'agrégat de mongodb ?

Les fonctions externes ne fonctionnent pas avec le framework d'agrégation. Tout est analysé en BSON en entrée, donc aucun JavaScript ou quoi que ce soit d'autre n'est autorisé. Tout cela est essentiellement traité de la définition de "l'opérateur" BSON à l'implémentation du code C++ natif, donc c'est vraiment rapide.

Cela revient à "convertir" votre logique attendue en ce que le cadre d'agrégation peut traiter. Il existe en fait des opérateurs "logiques" tels que $or et $and qui fonctionnent dans ce contexte :

db.collection.aggregate([
    { "$project": {
       "_id": 1,
       "status": {
           "$cond": [
               { "$or": [
                   // Your first set of rules requires "false" for "flag1" or 
                   // "flag2" and "true" for "flag3"
                   { "$and": [
                       { "$not": [
                           { "$or": [ "$flag1", "$flag2" ] },
                       ]},
                       "$flag3"
                   ]},
                   // Your second set of rules requires "true" for "flag1" or 
                   // "flag2" and "false" for "flag3"
                   { "$and": [
                       { "$or": [ "$flag1", "$flag2" ] },
                       { "$not": [ "$flag3" ] }
                   ]},
               ]},
               "ok",
               "broken"
           ]
       }
    }}
])

Donc, pas de fonctions externes, implémentez simplement la logique avec les opérateurs fournis par le framework d'agrégation. En plus des implémentations logiques de base, il y a $not pour "inverser" le ligic et $cond qui agit comme un "ternaire" afin de fournir un résultat différent de true/false évaluation.