MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Chamar função dentro do agregado do mongodb?


As funções externas não funcionam com a estrutura de agregação. Tudo é analisado para BSON na entrada, portanto, nenhum JavaScript ou qualquer outra coisa é permitido. Isso tudo é basicamente processado da definição do "operador" BSON para a implementação do código C++ nativo, por isso é muito rápido.

O que isso significa é "converter" sua lógica esperada para o que a estrutura de agregação pode processar. Existem de fato operadores "lógicos" como $or e $and que funcionam neste 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"
           ]
       }
    }}
])

Portanto, sem funções externas, apenas implemente a lógica com os operadores que o framework de agregação fornece. Além das implementações lógicas básicas, há $not para "reverter" o ligic e $cond que atua como um "ternário" para fornecer um resultado diferente de true/false avaliação.