Funkcje zewnętrzne nie działają w ramach agregacji. Wszystko jest parsowane do BSON na wejściu, więc żaden JavaScript ani nic innego nie jest dozwolone. Wszystko to jest zasadniczo przetwarzane od definicji „operatora” BSON do implementacji kodu natywnego C++, więc jest naprawdę szybkie.
Sprowadza się to do „konwertowania” oczekiwanej logiki na to, co może przetworzyć struktura agregacji. W rzeczywistości istnieją operatory „logiczne”, takie jak $or
i $and
które działają w tym kontekście:
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"
]
}
}}
])
Więc nie ma funkcji zewnętrznych, po prostu zaimplementuj logikę z operatorami, które dostarcza struktura agregacji. Oprócz podstawowych implementacji logicznych istnieje $not
aby "odwrócić" ligic i $cond
który działa jako „trójargument” w celu zapewnienia innego wyniku niż true/false
ocena.