Le funzioni esterne non funzionano con il framework di aggregazione. Tutto viene analizzato in BSON in input, quindi non è consentito JavaScript o altro. Tutto questo viene fondamentalmente elaborato dalla definizione di "operatore" BSON all'implementazione del codice C++ nativo, quindi è davvero veloce.
Ciò a cui si riduce è "convertire" la logica prevista in ciò che il framework di aggregazione può elaborare. Esistono infatti operatori "logici" come $or
e $and
che funzionano in questo contesto:
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"
]
}
}}
])
Quindi niente funzioni esterne, basta implementare la logica con gli operatori che fornisce il framework di aggregazione. Oltre alle implementazioni logiche di base c'è $not
per "invertire" la ligic e $cond
che funge da "ternario" per fornire un risultato diverso da true/false
valutazione.