Externe functies werken niet met het aggregatieraamwerk. Alles wordt bij invoer geparseerd naar BSON, dus JavaScript of iets anders is niet toegestaan. Dit wordt allemaal in principe verwerkt van BSON "operator"-definitie tot native C++-code-implementatie, dus het is echt snel.
Waar dit op neerkomt, is het "converteren" van uw verwachte logica naar wat het aggregatieraamwerk kan verwerken. Er zijn in feite "logische" operatoren zoals $or
en $and
die in deze context werken:
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"
]
}
}}
])
Dus geen externe functies, implementeer gewoon de logica met de operators die het aggregatieraamwerk levert. Naast de logische basisimplementaties is er $not
om de ligic te "omkeren" en $cond
die fungeert als een "ternair" om een ander resultaat te geven dan true/false
evaluatie.