だから私は次のようにMongoDBで計算されたカスタムフィールドが必要です
if( field1 =="A") ->customfield=10
else if(field1 =="B" )->customfield=20
else (field1 =="C" ) ->customfield=15
$ projectステートメントと共に集計を使用しています。ただし、$ cond演算子はelseif(elseのサブブランチ)を許可せず、単に2つの静的ブランチifおよびelseを許可します。ネストされたelseifを使用すると
"exception: field inclusion is not allowed inside of $expressions"
私のクエリはここにあります(エラーが表示されます)
db.items.aggregate([ { $project :
{
name: 1,
customfield:
{
$cond: { if: { $eq: [ "$field1", "4" ] }, then: 30,
else: {
if:
{ $eq: ["$field1","8"]},
then: 25, else: 10}}
}
}},{ $sort: { customfield: 1 }},{$limit:12}]);
これに対する方法または回避策はありますか。これが繰り返される質問である場合は申し訳ありませんが、同様の質問を見つけることができませんでした。
if..then..else
キーワードの $cond
演算子は、執筆時点での最新バージョンのMongoDBの最新の追加にすぎません。意図は明確にすることでしたが、この場合は混乱を招いたようです。
if..then.else
演算子 $cond
は実際に 三項 演算子であり、実装される多くのプログラミング言語で。これは、条件に対するロジックの「ブロック」を作成するのではなく、「インライン」条件として、最初の条件を満たさないものはelse
の下に属することを意味します。
したがって、ブロックに従うのではなく、ステートメントを「ネスト」します。
db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": {
"if": { "$eq": [ "$field1", "4" ] },
"then": 30,
"else": {
"$cond": {
"if": { "$eq": ["$field1","8"]},
"then": 25,
"else": 10
}
}
}
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);
Ternaryは、3つの条件を意味します。だからすべて if..then..else
ロジックはネストする必要があります。
MongoDB 3.4には、$switch
という新しいものがあります。
$switch: {
branches: [
{ case: <expression>, then: <expression> },
{ case: <expression>, then: <expression> },
...
],
default: <expression>
}
https://docs.mongodb.com/manual/reference/operator/aggregation/switch/
オブジェクトのみを使用している場合
{
$cond: {
$and: [
{ if: { $eq: ["$$field1", 'A'] }, then: '10', else: 15 },
{ if: { $eq: ["$$field1", 'B'] }, then: '20', else: 15 },
{ if: { $eq: ["$$field1", 'C'] }, then: '10', else: 15 },
]
}
}
そして、配列検索データを使用している場合
{
$map: {
input: "$fields", as: "field1", in: {
$cond: {
$and: [
{ if: { $eq: ["$$field1", 'A'] }, then: '10', else: 15 },
{ if: { $eq: ["$$field1", 'B'] }, then: '20', else: 15 },
{ if: { $eq: ["$$field1", 'C'] }, then: '10', else: 15 },
]
}
}
}
}