Externí funkce nefungují s agregačním rámcem. Vše je na vstupu analyzováno na BSON, takže není povolen žádný JavaScript ani nic jiného. To vše je v podstatě zpracováno od definice „operátora“ BSON po implementaci nativního kódu C++, takže je to opravdu rychlé.
Z toho plyne „převod“ vaší očekávané logiky na to, co dokáže zpracovat agregační rámec. Ve skutečnosti existují „logické“ operátory jako $or
a $and
které fungují v tomto kontextu:
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"
]
}
}}
])
Takže žádné externí funkce, jen implementujte logiku s operátory, které dodává agregační framework. Kromě základních logických implementací existuje $not
pro "obrácení" ligic a $cond
který se chová jako "ternární", aby poskytl jiný výsledek než true/false
hodnocení.