Externe Funktionen funktionieren nicht mit dem Aggregationsframework. Alles wird bei der Eingabe in BSON geparst, daher ist kein JavaScript oder irgendetwas anderes erlaubt. Dies wird im Grunde genommen von der BSON-"Operator"-Definition bis zur nativen C++-Code-Implementierung verarbeitet, sodass es wirklich schnell geht.
Es läuft darauf hinaus, Ihre erwartete Logik in das zu „konvertieren“, was das Aggregationsframework verarbeiten kann. Es gibt tatsächlich „logische“ Operatoren wie $or
und $and
die in diesem Zusammenhang funktionieren:
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"
]
}
}}
])
Also keine externen Funktionen, implementieren Sie einfach die Logik mit den Operatoren, die das Aggregationsframework bereitstellt. Zusätzlich zu den grundlegenden logischen Implementierungen gibt es $not
um die ligic und $cond
"umzukehren". die als "ternär" fungiert, um ein anderes Ergebnis als true/false
zu liefern Auswertung.