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

¿Llamar a la función dentro del agregado de mongodb?

Las funciones externas no funcionan con el marco de agregación. Todo se analiza en BSON en la entrada, por lo que no se permite JavaScript ni nada más. Todo esto se procesa básicamente desde la definición del "operador" BSON hasta la implementación del código C++ nativo, por lo que es realmente rápido.

A lo que se reduce esto es a "convertir" su lógica esperada a lo que puede procesar el marco de agregación. De hecho, existen operadores "lógicos" como $or y $and que funcionan en este contexto:

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

Entonces, no hay funciones externas, solo implemente la lógica con los operadores que proporciona el marco de agregación. Además de las implementaciones lógicas básicas, hay $not para "revertir" la lógica y $cond que actúa como un "ternario" para proporcionar un resultado diferente de true/false evaluación.