Външните функции не работят с рамката за агрегиране. Всичко се анализира до BSON при въвеждане, така че JavaScript или нещо друго не е разрешено. Всичко това основно се обработва от дефиницията на "оператор" на BSON до внедряване на собствен код на C++, така че е наистина бързо.
Това се свежда до "преобразуване" на вашата очаквана логика към това, което рамката за агрегиране може да обработва. Всъщност има "логически" оператори като $or
и $and
които работят в този контекст:
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"
]
}
}}
])
Така че няма външни функции, просто приложете логиката с операторите, които предоставя рамката за агрегиране. В допълнение към основните логически реализации има $not
за да "обърнете" ligic и $cond
който действа като "тройка", за да осигури различен резултат от true/false
оценка.