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.