web-dev-qa-db-ja.com

MongoDBに集約中に$ comeする別のifがありますか

だから私は次のように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}]);

これに対する方法または回避策はありますか。これが繰り返される質問である場合は申し訳ありませんが、同様の質問を見つけることができませんでした。

17
humblerookie

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ロジックはネストする必要があります。

32
Neil Lunn

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/

12
nort

オブジェクトのみを使用している場合

{
    $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 },
                ]
            }
        }
    }
}
0
KARNAV PARGI