Externa funktioner fungerar inte med aggregeringsramverket. Allt tolkas till BSON vid inmatning, så inget JavaScript eller något annat är tillåtet. Allt detta bearbetas i princip från BSON-"operator"-definition till inbyggd C++-kodimplementering så det går riktigt snabbt.
Vad det handlar om är att "konvertera" din förväntade logik till vad aggregeringsramverket kan bearbeta. Det finns faktiskt "logiska" operatorer som $or
och $and
som fungerar i detta sammanhang:
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"
]
}
}}
])
Så inga externa funktioner, implementera bara logiken med operatörerna som aggregeringsramverket tillhandahåller. Utöver de grundläggande logiska implementeringarna finns $not
för att "vända om" ligicen och $cond
som fungerar som en "ternär" för att ge ett annat resultat än true/false
utvärdering.