sql >> データベース >  >> NoSQL >> MongoDB

集計中に$condに他に何かありますか?

    最新のリリース(MongoDB 3.4以降)では、 $switchを使用します。 、これは基本的に switchに相当します またはcase 他の言語実装のキーワード:

    db.items.aggregate([
      { "$project": {
        "name": 1,
        "customfield": {
          "$switch": {
            "branches": [
              { "case": { "$eq": [ "$field1", "4" ] }, "then": 30 },
              { "case": { "$eq": [ "$field1", "8" ] }, "then": 25 }
            ],
            "default": 10
          }
        }
      }},
      { "$sort": { customfield: 1 }},
      { "$limit":12 }
    ])
    

    これにより、ネストが回避されます if..then..else $cond 以下に示します。ただし、以下は、明示的な if..then..else の新しい演算子の前であっても、これが常に実行できることを例として示しています。 元の配列表記は常にその構文を維持していたため、キーワード。

    配列にも注意してください ここでの条件の例は、通常、ネストされたを作成するよりも、プログラムで作成する方がはるかに簡単です。 $cond

    if..then..else $ condへのキーワード 演算子は、執筆時点でのMongoDBの最近のバージョンの時点での最近の追加にすぎません(MongoDB2.6はキーワードの導入でした 。実際のオペレーターは、MongoDB 2.2の集約フレームワークのリリースで利用可能になりました)。明確にすることを目的としていましたが、この場合、混乱を引き起こしているようです。

    if..then.elseとして 演算子 $ cond 確かに ternary 多くのプログラミング言語で実装されるのと同じように、演算子。これは、条件に対するロジックの「ブロック」を作成するのではなく、「インライン」条件として、最初の条件を満たさないものはすべて 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 }
    ]);
    

    または、元の配列でも プログラムでステートメントを作成する場合に好むかもしれない表記法:

    db.items.aggregate([
      { "$project": {
        "name": 1,
        "customfield": {
          "$cond": [
             { "$eq": [ "$field1", "4" ] }, 
             30,
             { "$cond": [
               { "$eq": ["$field1","8"] },
               25, 
               10
             ]}
          ]
        }
      }},
      { "$sort": { customfield: 1 }},
      { "$limit":12 }
    ]);
    

    三進法とは、3つの条件を意味します。それ以上でもそれ以下でもありません。したがって、すべての if..then..else ロジックはネストする必要があります。



    1. MongoDBコレクションの最小値を取得するにはどうすればよいですか?

    2. Javaを使用してJsonファイルからMongodbにデータをインポートするにはどうすればよいですか?

    3. MongoDBでは、インデックスが3つのフィールドにある場合、2つのフィールドでクエリを実行するときにそのインデックスを使用できますか? (3番目のフィールドのワイルドカード)

    4. MongoDBクエリをSpringMongoDB構文に変換します