外部関数は集約フレームワークでは機能しません。すべてが入力時に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
とは異なる結果を提供するための「3値」として機能します 評価。